我有一個令人生畏的設計問題,我懇求一些建議。簡而言之,我有兩個基類A
和B
,AImpl<T>
和BImpl<T>
分別從A
和B
繼承。我需要的是從一個多態A*
指針指向一個AImpl<T>
對象檢索(靜態)BImpl<T>*
,但沒有A
明確添加類似virtual B* getB()
和AImpl<T>
因爲B
和BImpl<T>
已經覆蓋它取決於A
這將增加一個循環依賴。 AImpl<T>
和BImpl<T>
專門針對原始類型,std :: string,T*
等。專門的模板類循環依賴
任何好的建議?
編輯:前向聲明在這裏沒有用,因爲即使添加了f.d.在A.h中的B,並且將方法虛擬的B * getB()放入A中,將AImpl作爲模板類,則需要該方法的完整定義。 getB()應該返回一個靜態的BImpl實例。
要解釋其他術語中的問題,會發生什麼情況:在用戶cpp中,我包含A.h並使用A類。假設AImpl將方法getB()定義爲
const B* getB() const {
static BImpl<T> instance;
return &instance;
}
此方法需要B.h的完全包含,從而導致循環依賴。
編輯2,完整的代碼示例 我會盡力把它放到一個簡單的代碼示例,希望能更好地解釋我的關心。
// File A.h
struct A
{
virtual ~A();
void const A* getChild() const { /* ... */}
virtual const B* getB() const = 0;
};
template <typename T>
struct AImpl : public A
{
const B* getB() const
{
return getBImpl_of<T>();
}
};
// Specializations of AImpl<T>
template<typename T>
const A* getAImpl_of()
{
static AImpl<T> instance;
return &instance;
}
// File B.h
struct B
{
template<typename T>
static void work()
{
getBImpl_of<T>()->doWork();
}
virtual ~B();
protected:
virtual void doWork() = 0;
};
template <typename T>
struct BImpl : public B
{
protected:
void doWork()
{
const A* pA = getAImpl_of<T>();
// ... do something with pA ...
// Here is the key point:
const A* pChild = pA->getChild();
pChild->getB()->doWork();
}
};
template<typename T>
const B* getBImpl_of()
{
static BImpl<T> instance;
return &instance;
}
這是我想要做的,但在B.h中明顯包括A.h,反之亦然會導致循環依賴。請注意,這並不是我所擁有的,但顯示了同樣的問題。謝謝。
向前聲明'class B;'應該允許你在'A'中聲明'virtual B * getB();'。一些示例代碼會有所幫助。 – aschepler 2013-02-24 15:27:02
同意@aschepler,這個位*「因爲B和BImpl已經依賴於A並且會添加循環依賴」*似乎表明您不知道前向聲明的存在。如果情況並非如此,則需要向我們展示一些代碼 –
2013-02-24 15:28:18
程序員之間交流思想的工具是* code *。請使用它。 – 2013-02-24 15:34:56