具有双重分派的循环依赖

Circular dependency with double dispatch

本文关键字:循环 依赖 分派      更新时间:2023-10-16

我试图实现双重调度模式,但我得到了一个循环依赖,我不能用前向声明解决(因为它在这个问题链接中已经解决了)。

下面是我的问题的一个例子:

标题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中向前声明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);
}