2016-05-10 15 views
2

ファクトリ実装ではかなり新しいので、おそらく私の質問は間違っていてよく定義されていません。 したがって、私は少数の言葉で、派生クラスのbanchを初期化するために、ファクトを増やしたいと思っています。空のコンストラクタを持つクラスではこれまで通り処理しています。コンストラクタの引数をブーストファクトリで渡す

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のコードは、クラスの空のコンストラクタのためにうまく動作しますが、私はベースと派生クラスのコンストラクタは、必要がある場合で、コードを変更する方法は非常にわかりませんよ引数を受け取る。私は順番に何をする必要があるかの修正は本当に分からないよ上で言ったように、そう

derived(int alpha, int beta) : base(alpha) // in order to pass the argument alpha to the base class 
{ 
    b = beta; 
} 

base(int alpha) { 
a = alpha; 
} 

そして、派生コンストラクタ:具体的にはのは、私は基本コンストラクタを持つようにしたいとしましょう上記のブーストファクトリの実装を自分のコードで動作させることができます。 ここでは、パラメータ化されたコンストラクタのためにオンラインの他の場所にいくつかの記事がありますが、私は自分自身でそれを行う方法を正しく理解できないため、この投稿を作成しました。 どんな種類のヘルプ/提案をいただければ幸いですか?

+1

[OT]を行うことがあります。 '静的std :: map ans; return ans; 'は' b_factory'のために十分です。 'new'は不要です。 – Jarod42

+0

あなたの工場に引数を渡しますか?またはいくつかの値をバインドしたいですか? 'base :: b_factory()。at(" derived ")(alpha、beta)'を呼び出すか、 'base :: b_factory()。at(" derived ")()'は 'derived' 42、51) '? – Jarod42

+0

こんにちは、あなたの答えをありがとう、私は私の目的のために、ファクトリコマンドでオブジェクトを初期化するときに、例えばコンストラクタのパラメータを持たない単純な場合のように、ファクトリに引数を渡したいと思います。 基本例= base :: b_factory()["derived"](); 私は、コンストラクタパラメータ(私たちの場合は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

関連する問題