2013-03-26 2 views
2

이것은 아마도 불가능하지만 C++은 전에 놀랐습니다. 그래서 여기에 있습니다.정적 메서드가 호출 된 클래스를 가져올 수 있습니까?

나는이 기본 클래스와 세 개의 거의 동일한 서브 클래스가 있습니다

class MyBaseClass { 
}; 

class MyClassX : public MyBaseClass { 
public: 
    static MyClassX *create() { return new MyClassX(); } 
}; 

class MyClassY : public MyBaseClass { 
public: 
    static MyClassY *create() { return new MyClassY(); } 
}; 

class MyClassZ : public MyBaseClass { 
public: 
    static MyClassZ *create() { return new MyClassZ(); } 
}; 

을하고 나는이처럼 그들을 호출 할 수 있습니다

MyClassY *myObjectY = MyClassY::create(); 

나는 기본 클래스가 할 수있는 단축 할 그리고 모든 하위 클래스에 대해 create() 정의를 반복하지 않아도됩니다.

class MyBaseClass { 
public: 
    template<typename CalledForWhichClass> 
    static CalledForWhichClass *create() { 
     return new CalledForWhichClass(); 
    } 
}; 

class MyClassX : public MyBaseClass { }; 

class MyClassY : public MyBaseClass { }; 

class MyClassZ : public MyBaseClass { }; 

그러나,이 설정으로, 지금처럼 전화를해야 :

MyClassY myObjectY = MyBaseClass::create<MyClassY>(); 

을하지만 난에 예전처럼 그렇게 난 여전히 그들을 호출 할 수 있도록하려면 :

MyClassY *myObjectY = MyClassY::create(); 
내가 기대했다

아마도 거기 같은 몇 가지 마술 :

class MyBaseClass { 
public: 
    template<typename CalledForWhichClass = __static_context__> 
    static CalledForWhichClass *create() { 
     return new CalledForWhichClass(); 
    } 
}; 

아이디어가 있으십니까?

+0

나는 왜 이런 식으로 일하는지 이해하지 못한다. 초기화가 필요 없다면'new' 키워드를 사용하여 클래스를 직접 인스턴스화하십시오. – Yaniv

+0

캡슐화의 이유는 대부분이 코드의 사용자가 앞으로 선언 된 MyClassX, MyClassY 및 MyClassZ 만 보길 원합니다. 내가 새로운 것을 사용한다면, 나는 그들에게 수업의 완전한 선언을 보게해야한다. – Verdagon

답변

2

CRTP를 사용하는 것은 어떻습니까? 대신 기본 클래스가 일을 만들려고 노력의

template <typename Derived> 
struct BasicMyClass : MyBaseClass { 
    static Derived *create() { return new Derived(); } 
}; 

struct MyClassX : public BasicMyClass<MyClassX> {}; 
struct MyClassY : public BasicMyClass<MyClassY> {); 
struct MyClassZ : public BasicMyClass<MyClassZ> {); 

, 당신은 자동으로 당신을 위해 create 멤버 함수를 만들려면이 템플릿을 사용합니다.

+0

와우, 나는 생각하지 않았다! 무리 감사! – Verdagon

+0

이것은 대부분의 경우 작동하지만 Qt 클래스에는 작은 예외가 있습니다. QObject에서 파생 된 (따라서'moc'을 통해 실행되는) 것은 템플릿을 사용할 수 없습니다. "Q_OBJECT에서 지원하지 않는 템플릿 클래스"라는 오류가 발생합니다. –

+0

@GeorgeEdison : 이것은 QObject에서 파생 된 클래스에 대한 제한 일뿐입니다. 그러나 클래스가 QObject에서 파생되지 않은 클래스 템플릿의 인스턴스에서 파생 된 경우에는 정상적으로 처리되어야합니다. –

관련 문제