双重调度的循环依赖

时间:2015-05-22 16:03:04

标签: c++ double-dispatch

我试图实现双重调度模式,但是我获得了循环依赖,我无法通过前向声明来解决(因为它在此问题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中声明BoundaryBlockage,因为我需要一个完整的类型才能使用boost::unordered_set。有什么建议可以解决这个问题吗?

1 个答案:

答案 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);
}