双重分派的循环依赖
Circular dependency with double dispatch
我正在尝试实现双分派模式,但我得到了一个循环依赖,我无法通过前向声明解决它(因为它已在这个问题 link 中解决)。
下面是我的问题的一个例子:
header 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);
}
};
header 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 中转发声明 Boundary
和 Blockage
,因为我需要一个完整的类型才能使用 boost::unordered_set
。有什么解决这个问题的建议吗?
转发头文件 1 中的 Collection
声明,并将 dispatchAdd
的实现从头文件移到源文件中。
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;
};
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);
}
我正在尝试实现双分派模式,但我得到了一个循环依赖,我无法通过前向声明解决它(因为它已在这个问题 link 中解决)。
下面是我的问题的一个例子:
header 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);
}
};
header 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 中转发声明 Boundary
和 Blockage
,因为我需要一个完整的类型才能使用 boost::unordered_set
。有什么解决这个问题的建议吗?
转发头文件 1 中的 Collection
声明,并将 dispatchAdd
的实现从头文件移到源文件中。
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;
};
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);
}