Я довольно новичок в реализации всей фабрики, и, как результат, мой вопрос будет звучать неправильно и не очень четко определен. Итак, с несколькими словами я хочу иметь фактологию boost, чтобы инициализировать производные классы banch fo, и до сих пор мне удалось сделать это для классов с пустыми конструкторами. Позвольте мне представить моей текущей реализации подталкивание фабрики для двух небольших классов:Передача аргументов в конструкторе с фабрикой boost
Base.h:
#ifndef BASE_H_
#define BASE_H_
#include <vector>
#include <map>
#include "boost/function.hpp"
class base {
protected:
typedef boost::function <base *()> basefactory;
public:
base();
virtual ~base();
int a;
static std::map<std::string,base::basefactory>& b_factory();
};
#endif /* BASE_H_ */
Base.cpp:
#include "base.h"
base::base() {
// TODO Auto-generated constructor stub
}
base::~base() {
// TODO Auto-generated destructor stub
}
static std::map<std::string,base::basefactory>& base::b_factory()
{
static std::map<std::string,base::basefactory>* ans =
new std::map<std::string,base::basefactory>();
return *ans;
}
Derived.h:
#ifndef DERIVED_H_
#define DERIVED_H_
#include "boost/function.hpp"
#include "boost/functional/factory.hpp"
#include <iostream>
#include "base.h"
class derived : public base {
public:
derived();
virtual ~derived();
int b;
static class _init {
public:
_init() {
base::b_factory()["derived"] = boost::factory<derived*>();
}
}_initializer;
};
#endif /* DERIVED_H_ */
Derived.cpp:
#include "derived.h"
derived::derived() {
// TODO Auto-generated constructor stub
}
derived::~derived() {
// TODO Auto-generated destructor stub
}
derived::_init derived::_initializer;
Итак, выше desplayed код прекрасно работает для пустого конструктора классов, но я очень уверен, как изменить код в случае базы и производные Конструкторы класса нужно для получения аргументов. Более конкретно, скажем, что я хочу, чтобы иметь базовый конструктор:
base(int alpha) {
a = alpha;
}
А также производный конструктор:
derived(int alpha, int beta) : base(alpha) // in order to pass the argument alpha to the base class
{
b = beta;
}
Итак, как было сказано выше я действительно не знаю, какие изменения мне нужно сделать для того, чтобы добиться того, чтобы эта надстройка была реализована для моего кода. Я знаю, что есть некоторые должности здесь, в другом месте онлайн для параметризованных конструкторов, но они не смогли заставить меня правильно понять, как это сделать сам, и именно поэтому я сделал это сообщение. Любая помощь/предложение были бы высоко оценены!
[OT]: 'static std :: map ans; return ans; 'достаточно для' b_factory'. 'new' unneeded. –
Jarod42
Вы хотите передать аргумент своей фабрике? или вы хотите привязать какое-то значение? Итак, вы хотите вызвать 'base :: b_factory(). At (" производный ") (альфа, бета)' или что 'base :: b_factory(). At (" производный ")()' вызывает 'производный (42, 51) '? – Jarod42
Привет, спасибо за ваш ответ. Я считаю, что для своей цели хочу передать аргументы фабрике в том смысле, что при инициализации объектов с помощью заводской команды, например, в простом случае без параметров в конструкторе: базовый пример = base :: b_factory() ["received"](); Я хочу, чтобы пользователь мог передавать значения, которые будут использоваться для параметров конструктора (int alpha и int beta в нашем случае) – user3111197