2016-07-09 3 views
0

여기 내 목표는 문자열과 정수를 기반으로 객체를 인스턴스화하고 싶습니다. 내 생각은 다음과 같습니다 :초기화되지 않은 객체 목록

1) 가능한 개체 목록을 만듭니다. 2) 각 개체는 문자열과 정수를 취하는 정적 메서드를 가지며 전달 된 것이 정적 개체와 일치하면 true를 반환합니다. 그 다음 특정 오브젝트를 실제의 인스턴스를 반환하는 경우 3) 그런 다음 해당 객체의 정적 함수를 호출 가능한 개체 목록 반복 :

의사가

:

// Pseudo Definitions 
class CoolObject 
class CoolObject2: public CoolObject .... 
class CoolObject3: public CoolObject .... 

// List of Objects 
std::list<CoolObject> list_of_possible_objects; 
list_of_possible_objects.push_back(CoolObject); 
list_of_possible_objects.push_back(CoolObject2); 
list_of_possible_objects.push_back(CoolObject3); 

// Inside of the matching function 
for (std::list<CoolObject>::iterator it=list_of_possible_objects.begin(); it != list_of_possible_objects.end(); it++) { 
    if(*it::is_cool_object(string, int)) { 
     return *it(string1, string2); //Assume the constructor takes some objects that were passed into the function 
    } 
} 

그러나이 꿈 이후처럼 보인다 C++에서는 인스턴스화되지 않은 객체를 허용하지 않습니다.

나는 약간의 맵과 switch 문으로이 작업을 수행 할 수 있다고 확신한다. 그러나 이것은 내 머리 속에서 훨씬 더 우아 해 보였으므로 나는 먼저 그것을 갔다.

내가 따라 올 수있는 이와 비슷한 패턴이 있습니까? 아니면 내가 요구하는 것을 합법적으로 만들 수있는 방법이 있습니까?

나는 거대한지도를 유지하고 싶지 않고 차라리 오브제 목록을 가지고 각 객체에 물어 보면 거대한지도와 스위치 문을 갖는 것이 유일한 방법 인 경우 인스턴스화한다. . 나는 이것이 가능한지 또는 이런 방식으로 포기하기 전에 그것을하는 더 좋은 방법이 있다면 어쩌면 어떤 전문가에게 물어볼 것이라고 생각했다.

모든 도움에 감사드립니다!

+0

나는 당신이하려고하는 것이 인스턴스가 아닌 공장 목록을 가지고 있다고 생각한다. – kfsone

+4

디자인이나 패턴에도 불구하고 해결해야 할 실제 문제는 무엇입니까? –

+0

'std :: pair'의 목록을 만드십시오. 쌍의 첫 번째 요소는 테스트 함수이고, 두 번째 요소는 생성자 함수입니다. 그런 다음'{CoolObject :: is_cool_object, CoolObject}','{CoolObject2 :: is_cool_object, CoolObject2}'등으로 채 웁니다. 루프는 첫 번째 함수를 호출하고 성공하면 생성자를 호출합니다. – Barmar

답변

0

저장소 std::optional<T>, 그게 아마도 당신이 찾고있어 : 기본적으로 개체가 구성되어 있는지 여부를 알려주는 깃발 iff 건설에 대한 참조. 소멸자를 실행할 것인지 여부를 알아야하므로 플래그를 확보 할 수 없습니다.