이것은 아마도 불가능하지만 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();
}
};
아이디어가 있으십니까?
나는 왜 이런 식으로 일하는지 이해하지 못한다. 초기화가 필요 없다면'new' 키워드를 사용하여 클래스를 직접 인스턴스화하십시오. – Yaniv
캡슐화의 이유는 대부분이 코드의 사용자가 앞으로 선언 된 MyClassX, MyClassY 및 MyClassZ 만 보길 원합니다. 내가 새로운 것을 사용한다면, 나는 그들에게 수업의 완전한 선언을 보게해야한다. – Verdagon