2016-05-10 2 views
2

Я довольно новичок в реализации всей фабрики, и, как результат, мой вопрос будет звучать неправильно и не очень четко определен. Итак, с несколькими словами я хочу иметь фактологию 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; 
} 

Итак, как было сказано выше я действительно не знаю, какие изменения мне нужно сделать для того, чтобы добиться того, чтобы эта надстройка была реализована для моего кода. Я знаю, что есть некоторые должности здесь, в другом месте онлайн для параметризованных конструкторов, но они не смогли заставить меня правильно понять, как это сделать сам, и именно поэтому я сделал это сообщение. Любая помощь/предложение были бы высоко оценены!

+1

[OT]: 'static std :: map ans; return ans; 'достаточно для' b_factory'. 'new' unneeded. – Jarod42

+0

Вы хотите передать аргумент своей фабрике? или вы хотите привязать какое-то значение? Итак, вы хотите вызвать 'base :: b_factory(). At (" производный ") (альфа, бета)' или что 'base :: b_factory(). At (" производный ")()' вызывает 'производный (42, 51) '? – Jarod42

+0

Привет, спасибо за ваш ответ. Я считаю, что для своей цели хочу передать аргументы фабрике в том смысле, что при инициализации объектов с помощью заводской команды, например, в простом случае без параметров в конструкторе: базовый пример = base :: b_factory() ["received"](); Я хочу, чтобы пользователь мог передавать значения, которые будут использоваться для параметров конструктора (int alpha и int beta в нашем случае) – user3111197

ответ

2

Если вы хотите завод, который принимает 2 аргумента, вы можете сделать:

std::map<std::string, boost::function<base* (int, int)>> factories; 
factories["derived"] = boost::bind(boost::factory<derived*>(), _1, _2); 

std::unique_ptr<base> b{factories.at("derived")(42, 52)}; 

Если вы хотите, чтобы исправить аргументы, вы можете сделать

std::map<std::string, boost::function<base*()>> factories; 
factories["derived"] = boost::bind(boost::factory<derived*>(), 42, 52); 
std::unique_ptr<base> b{factories.at("derived")()}; 

Demo

+0

Большое спасибо за вашу помощь, теперь все работает правильно! – user3111197

Смежные вопросы