2017-11-06 7 views
1

特定の種類のオブジェクトを生成するファクトリクラスがあります。しかし、現時点では、この関数は、オブジェクトをインスタンス化してプログラムの主要スコープに戻す前に、明示的なパラメータセットを取ります。これらのオブジェクトは、パラメータとして乱数を使用して生成されます。ある時点で、オブジェクトのクラスのコンストラクタをオーバーロードして、多かれ少なかれパラメータを取得します。したがって、さまざまなパラメータを使って同じオブジェクトを生成するファクトクラスの多くの関数を作成することを避けるために、私は初期化リストを使用できると考えました。私はこのソリューションを実装しようとしましたが、私は悲惨に失敗しました。誰かが私に啓発してもらえますか?それとも、正しい方向に私を指す:)以下 イニシャライザリストをジェネレータ関数に渡すことで、特定の種類のオブジェクトを初期化することができます

は私が

#include <iostream> 
#include <initializer_list> 

// iostream 
using std::cout; 
using std::endl; 

// initializer list 
using std::initializer_list; 

// Class of which type I want to generate objects; 
class Subject{ 
private: 
    double x; 
    double y; 
public: 
    Subject(const double x, const double y); // <-- This may vary in parameter set! 
    void print(); 
}; 

// Class which is responsible for generating objects of type specified above; 
class Generator{ 
public: 
    Generator(); 
    Subject generate(initializer_list<double> params); 
}; 

// Subject Member Implementation 
Subject::Subject(const double x, const double y):x(x), y(y){} 

void Subject::print(){ 
    std::cout << "x: " << x << "y: " << y << std::endl; 
} 

// Generator Member Implementation 
Generator::Generator(){} 

Subject Generator::generate(initializer_list<double> params){ 
    Subject subject = params; 

    return subject; 
} 

// Main Body 
int main(){ 
    Generator generator; 
    double params[2] = {.1,.2}; // <-- arbitrary set of parameter(s) 

    Subject subject = generator.generate({params}); // <-- object cration; 

    subject.print(); 
} 
+1

あなたは_initializerのlist_を取る関数を書いていますが、それに_array_に合格しようとしていますか? – Steve

+0

私はそれがうまくいくと思った。私が 'auto test = {parameters}'を実行すると正しいタイプが得られるからです。 :C++は私の最初の言語ではないので、私はいくつかの指針を感謝します:) –

+2

[mcve]を投稿してください。 –

答えて

2
動作するように作ることができる

を実行しようとしていますが、種類や暗黙の型が考慮されなければならないものの基本的な例です。

はここで働いていないだろうか対に働くだろう何のいくつかの例です:

#include <initializer_list> 
#include <iterator> 

void f(std::initializer_list<int> il) {} 

int main() 
{ 
    int parameters[4]{1, 2, 3, 4}; 
    auto test1 = {parameters}; // parameters decays into an int*, so we get an initializer_list of int*s (single pointer in this case) 

    // named parameter causes problems 
    //f(parameters); // doesn't compile, can't convert array to initializer_list 
    //f({parameters}); // doesn't compile, initializer_list types are different 
    //f({std::begin(parameters), std::end(parameters)}); // doesn't compile, considered as list of pointers 

    // this works on MSVC, but is probably not standard C++ 
    std::initializer_list<int> test2(std::begin(parameters), std::end(parameters)); // use constructor that accepts iterators 
    f(std::initializer_list<int>(std::begin(parameters), std::end(parameters))); // ok 
    f(test2);   // ok 

    f({1, 2, 3, 4}); // ok, can construct parameter with this initializer 
    f({});    // ok, for the same reason as above 
} 
+0

お返事ありがとうございます。私は非常に感謝する:) –

関連する問題