2017-11-06 9 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

답변 해 주셔서 감사합니다. 나는 그다지 감사하지 않는다 :) –