2011-04-05 7 views
1

체크 포인트 구현을 위해 게임에서 Memento 패턴을 구현하고 싶습니다.템플릿, 다형성, 추상 기본 클래스 포인터 및 런타임 캐스팅

게임에 GameObject 포인터 목록이 있습니다. GameObject는 StaticObject, AnimatedObject 등과 같은 클래스에 의해 구현되는 추상 클래스입니다.

내 Memento 클래스를 가능한 한 추상적으로 만들고 싶습니다. 따라서 전체 Memento 시스템을 템플릿으로 만들었습니다.

my (아주 베어 본, 디버깅 목적으로) Memento class is;

template<class T> 
class Memento 
{ 
public: 
    Memento() { } 

    Memento(T data) 
    { 
     setData(data); 
    } 
    void setData(T data) 
    { 
    //wanting this function to do complex behaviour 
    } 

    T _state; 
}; 

나는 T가 포인터인지 아닌지를 구별하는 논리를 사용합니다.

_state는 Memento의 목적을 무효로하는 포인터 자체의 복사본이 아닌 실제 GameObject 복사본의 포인터 여야합니다.

메멘토 템플릿에서 수행하고 싶은 과정은 다음과 같습니다.

1) 추상 기본 클래스에 대한 포인터를 전달합니다.

2) (런타임에) 가리키는 하위 클래스의 유형을 결정하십시오.

3) 포인터가 _state (2에서 얻은 형식) 인 힙에 새 하위 클래스를 만듭니다.

4) 데이터를 복사하십시오.

내가 겪고있는 문제는 3입니다. 적절한 유형의 하위 클래스를 얻을 수있는 방법이없는 것처럼 보입니다.

typeid (* data) 및 decltype (* data)은 하위 참조를 반환합니다. 내가 자동을 사용하려고한다면 그것은 참조 일 뿐이다. 분명히 유형으로 참조를 새로 사용할 수는 없습니다.

이 방법은 분명히 Memento 외부에서 자식 클래스의 복사본을 새로 작성한 다음이를 전달하는 것입니다. 그러나 런타임시 Template 클래스에서 완전히 수행하는 방법이 있는지 알고 싶습니다. . 나는 그것이 몇 시간 동안 일할 수 있는지를 알아 내려고 노력해 왔으며, 나를 고집하는 부분은 포기하고 싶지 않다.

답변

4

"가상 복사본 생성자"또는 복제, 관용구를 찾고 있습니다.

class GameObject { 
    ... 
public: 
    virtual GameObject* clone() = 0; 
}; 

class StaticObject : public GameObject { 
    ... 
public: 
    virtual StaticObject* clone() { return new StaticObject(*this); } 
}; 

//.. 
+0

고맙습니다 !!!!!!! – whalebiologist