c++ - 双重分派(dispatch)的循环依赖

标签 c++ double-dispatch

我正在尝试实现双分派(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;
}

我无法在 header 2 中转发声明 BoundaryBlockage,因为我需要一个完整的类型才能使用 boost::unordered_set。有什么解决这个问题的建议吗?

最佳答案

在 header 1 中转发声明 Collection,并将 dispatchAdd 的实现从 header 文件移到源文件中。

objects.h(即“header 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;
};

对象.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);
}

关于c++ - 双重分派(dispatch)的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30401231/

相关文章:

c++ - 如何在 Visual Studio C++ 2012 中创建文件夹

c++ - 什么是单次 dispatch 和双重 dispatch ?

c++ - 在 C++ 中使用两个类层次结构实现双重分派(dispatch)

smalltalk - Pharo 的双重调度

c# - 根据另一个对象的类型选择/使用具有通用参数的接口(interface)的实现

c++ - 分配和删除指针数组

c++ - 构建 LLVM/clang 时出错

c++ - qml 元素的自定义渲染

c++ - VC++ 允许的函数中局部变量的最大数量是多少?