2013-02-24 117 views
2

我有一個令人生畏的設計問題,我懇求一些建議。簡而言之,我有兩個基類AB,AImpl<T>BImpl<T>分別從AB繼承。我需要的是從一個多態A*指針指向一個AImpl<T>對象檢索(靜態)BImpl<T>*,但沒有A明確添加類似virtual B* getB()AImpl<T>因爲BBImpl<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,反之亦然會導致循環依賴。請注意,這並不是我所擁有的,但顯示了同樣的問題。謝謝。

+0

向前聲明'class B;'應該允許你在'A'中聲明'virtual B * getB();'。一些示例代碼會有所幫助。 – aschepler 2013-02-24 15:27:02

+1

同意@aschepler,這個位*「因爲B和BImpl 已經依賴於A並且會添加循環依賴」*似乎表明您不知道前向聲明的存在。如果情況並非如此,則需要向我們展示一些代碼 – 2013-02-24 15:28:18

+0

程序員之間交流思想的工具是* code *。請使用它。 – 2013-02-24 15:34:56

回答

1

前向聲明應該沒問題,因爲模板方法在使用之前不會被實例化。

嘗試把這個在您的A.H的頂部:

struct B; 
template <typename T> const B* getBImpl_of(); 

那麼你可以從內部B.H.包括A.H

+0

這就是現在(實際代碼中)的實際情況,但不幸的是它不起作用。當詢問getAImpl_of ()時,鏈接器抱怨「getBImpl_of ()」的未定義。我已經解決了重新設計整個系統。不管怎樣,謝謝你。 – keebus 2013-02-24 19:04:59