我试图实现双重调度模式,但是我获得了循环依赖,我无法通过前向声明来解决(因为它在此问题link中得到了解决)。
以下是我的问题示例:
标题1:
class Object
{
virtual void dispatchAdd(Collection& c) const = 0;
};
class Blockage: Object
{
virtual void dispatchAdd(Collection& c) const
{
c.add(*this);
}
};
class Boundary: Object
{
virtual void dispatchAdd(Collection& c) const
{
c.add(*this);
}
};
标题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中声明Boundary
和Blockage
,因为我需要一个完整的类型才能使用boost::unordered_set
。有什么建议可以解决这个问题吗?
答案 0 :(得分:2)
在标头1中转发声明Collection
,并将dispatchAdd
的实现移出头文件并移入源文件。
objects.h(即&#34;标题1&#34;):
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);
}