2015-05-22 42 views
1

我試圖實現雙調度模式,但我得到了一個循環依賴,我無法使用前向聲明來解決(因爲它已在此問題link中解決)。雙重調度的循環依賴

下面是我的問題的一個例子:

頭1:

頭2:

class Collection 
{ 
public: 
    void add(const Blockage& b) 
    { ... } 

    void add(const Boundary& b) 
    { ... } 

    ... 

private: 
    boost::unordered_set<Boundary> m_boundaries; 
    boost::unordered_set<Blockage> m_blockages; 
} 

我不能向前聲明在集管2和BoundaryBlockage,因爲我需要一個完整的類型來使用boost::unordered_set。任何建議來解決這個問題?

回答

2

在頭文件1中向前聲明Collection,並將dispatchAdd的實現從頭文件移出並移入源文件。

objects.h(即 「標題1」):

class Collection; 

class Object 
{ 
    virtual void dispatchAdd(Collection& c) const = 0; 
}; 

class Blockage: Object 
{ 
    virtual void dispatchAdd(Collection& c) const; 
}; 

class Boundary: Object 
{ 
    virtual void dispatchAdd(Collection& c) const; 
}; 

objects.cpp

#include "objects.h"  // i.e. "header 1" 
#include "collection.h" // i.e. "header 2" 

void Blockage::dispatchAdd(Collection& c) const 
{ 
    c.add(*this); 
} 

void Boundary::dispatchAdd(Collection& c) const 
{ 
    c.add(*this); 
} 
+0

半相關...移動add'的'的實現在頭2插入相應的源文件以及。保持標題簡單和乾淨! –

+0

謝謝,是的,'add'沒有在頭文件2中實現,我不知道爲什麼我在示例中添加了括號。 – dlavila