여기 내 목표는 문자열과 정수를 기반으로 객체를 인스턴스화하고 싶습니다. 내 생각은 다음과 같습니다 :초기화되지 않은 객체 목록
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 문으로이 작업을 수행 할 수 있다고 확신한다. 그러나 이것은 내 머리 속에서 훨씬 더 우아 해 보였으므로 나는 먼저 그것을 갔다.
내가 따라 올 수있는 이와 비슷한 패턴이 있습니까? 아니면 내가 요구하는 것을 합법적으로 만들 수있는 방법이 있습니까?
나는 거대한지도를 유지하고 싶지 않고 차라리 오브제 목록을 가지고 각 객체에 물어 보면 거대한지도와 스위치 문을 갖는 것이 유일한 방법 인 경우 인스턴스화한다. . 나는 이것이 가능한지 또는 이런 방식으로 포기하기 전에 그것을하는 더 좋은 방법이 있다면 어쩌면 어떤 전문가에게 물어볼 것이라고 생각했다.
모든 도움에 감사드립니다!
나는 당신이하려고하는 것이 인스턴스가 아닌 공장 목록을 가지고 있다고 생각한다. – kfsone
디자인이나 패턴에도 불구하고 해결해야 할 실제 문제는 무엇입니까? –
'std :: pair'의 목록을 만드십시오. 쌍의 첫 번째 요소는 테스트 함수이고, 두 번째 요소는 생성자 함수입니다. 그런 다음'{CoolObject :: is_cool_object, CoolObject}','{CoolObject2 :: is_cool_object, CoolObject2}'등으로 채 웁니다. 루프는 첫 번째 함수를 호출하고 성공하면 생성자를 호출합니다. – Barmar