단일 UI 클래스에서 상속 된 일련의 클래스를 관리하는 UIManager가 있습니다.템플릿 및 지연 초기화
class UIManager
{
public:
UIManager(); // Constructor
virtual ~UIManager(); // Destructor
template <typename T>
T *getUI()
{
static T ui(); // Constructs T, stores result in ui when
// getUI<T>() is first called
return &ui;
}
}
로 호출 :
getUI<NameEntryUI>()->activate();
또는
getUI<MenuUI>()->render();
내가 디자인을 고려하고 현재는 개별 사용자 인터페이스가 느리게 초기화하고 정적으로 저장됩니다 이런 식으로 뭔가를 작동 변경하면 하나 이상의 플레이어, 따라서 하나 이상의 게임 창, 따라서 하나 이상의 UIManager를 가질 수 있습니다. UIManager가 삭제 될 때 모든 생성 된 ui 객체를 정리하기를 원합니다 (현재는 ui 객체가 정적이기 때문에 프로그램이 종료 될 때까지 고정되어 있습니다).
UIManager가 종료되었을 때 위의 개체를 제거하려면 어떻게 다시 작성할 수 있습니까? 여기 ======================================
이 해결책 구현했습니다. 초기 결과는 잘 작동한다는 것입니다.
기본적으로 나는 Potatoswatter가 제안한 아이디어로 시작했습니다. Potatoswatter는 내가 좋아하는 방식으로, typeid (T)에 대해 몰랐기 때문에 내가 시작한 방식과 비슷했기 때문에 좋아했습니다. C++ 98 기능 만 사용하도록 코드를 백 포트했습니다. 전체적으로 중요한 것은 typeid (T)입니다.이 인터페이스를 사용하면 인스턴스화 된 인터페이스를 해당 유형에 일관된 방식으로 매핑 할 수 있습니다.
class UIManager
{
typedef map<const char *, UserInterface *> UiMapType;
typedef UiMapType::iterator UiIterator;
map<const char *, UserInterface *> mUis;
public:
UIManager(); // Constructor
virtual ~UIManager() // Destructor
{
// Clear out mUis
for(UiIterator it = mUis.begin(); it != mUis.end(); it++)
delete it->second;
mUis.clear();
}
template <typename T>
T *getUI()
{
static const char *type = typeid(T).name();
T *ui = static_cast<T *>(mUis[type]);
if(!ui)
ui = new T();
mUis[type] = ui;
return ui;
}
}
'std :: shared_ptr '을 저장하면 유형에 공통 기본 클래스 나 가상 소멸자가 필요하지 않음을 의미합니다. –
@JonathanWakely 아무 것도 공유하지 않기 때문에 약간의 학대가 일어납니다. 진심으로, 다형성이없는 UI는 광란입니다. 무의미한 행동을 유도하고 클릭에 응답하는 가상의 방법이 없다면, 프로그램 조직에 심각한 문제가 있습니다. – Potatoswatter
내 질문에 언급했듯이, 모든 내 UI 개체는 일반적인 부모로부터 상속받습니다 (여기에는 정신 나간 것이 없습니다 :-). 난 그런지도를 만들려고했지만 unique_ptr을 사용하지 않을 생각이었습니다. 유일한 단점은 unique_ptr이 C++ 11 항목이며 아직 완전히 포용하지 못했다는 것입니다. – Watusimoto