我有一堆容器和對象。容器和對象具有模板化的子類。那些模板化的子類有專門的子類。在專門的對象中,我想檢索它們的容器。下面的代碼設置:返回模板子類
class Container;
template<class T> class SubContainer;
class Object
{
public:
Object() : m_pContainer(NULL) { }
public:
Container* GetContainer()
{
return m_pContainer;
}
void SetContainer(Container* pContainer)
{
m_pContainer = pContainer;
}
private:
Container* m_pContainer;
};
class Container
{
public:
Container() : m_pObject(NULL) { }
virtual ~Container() { }
public:
void SetObject(Object* pObject)
{
m_pObject = pObject;
m_pObject->SetContainer(this);
}
protected:
Object* m_pObject;
};
template<class T>
class SubObject : public Object
{
public:
virtual SubContainer<SubObject>* GetSubContainer()
{
return dynamic_cast<SubContainer<SubObject>*>(GetContainer());
}
void TestMe()
{
SubContainer<SubObject>* pSubContainer = GetSubContainer();
assert(pSubContainer);
}
};
template<class T>
class SubContainer : public Container
{
};
class SubObjectInt : public SubObject<int>
{
};
class SubContainerSubObjectInt : public SubContainer<SubObject<int> > // works
//class SubContainerSubObjectInt : public SubContainer<SubObjectInt> // fails
{
};
測試代碼:
SubContainerSubObjectInt* pContainer = new SubContainerSubObjectInt();
SubObjectInt* pObject = new SubObjectInt();
pContainer->SetObject(pObject);
pObject->TestMe();
我知道SubContainer<SubObjectInt>
不是SubContainer<SubObject<int> >
即使SubObjectInt
是一個子類SubObject<int>
一個子類。
我標記了代碼「工作」和「失敗」。說「失敗」的行在我的代碼中更具邏輯意義,但我無法檢索到保存它的適當的子容器。動態轉換總是返回NULL。
我的問題是:我如何檢索正確的SubContainer
與GetSubContainer()
在SubObject
?
我希望這是有道理的。
因此不可能將pContainer聲明爲SubContainerSubObjectInt?因爲所有專門的類都有代碼(我只是將它們設爲空白以儘可能簡化示例)。 – Ben 2011-05-05 17:23:54