【发布时间】:2011-08-04 19:36:54
【问题描述】:
我有两个类存在循环依赖问题:
- A 有一个 B 类的成员变量
- B 是
vector<A>的子类
我最初是这样解决的:
啊哈:
#include "B.h"
class A
{
B b;
}
B.h:
class A;
class B : public vector<A>
{
}
#include "A.h"
不幸的是,如果 A 和 B 在 Windows 上导出,MSVC 在构建 B 时会因为没有完整的 A 定义而窒息。
为了解决这个问题,我需要在 A 中存储一个指向 B 的指针。我想要一个包装器,比如 boost::scoped_ptr,但它会在其构造函数中创建一个新对象,并且具有与它指向的对象。这将采取以下形式:
啊哈:
class B;
class A
{
magic_ptr<B> b;
}
B.h:
#include "A.h"
class B : public vector<A>
{
}
在我重新发明轮子之前,有谁知道这是否已经存在于 STL 或 boost 中?
【问题讨论】:
-
你不应该 a) 建立循环依赖 b) 继承 STL 容器。
-
这不仅仅是一个 Visual C++ 问题:你不能实例化一个类型不完整的容器;这样做会产生未定义的行为。从最佳实践的角度来看,您几乎可以肯定不是来自
vector;它没有虚拟成员函数,没有虚拟析构函数,也没有受保护的成员。在几乎所有用例中,组合都是更好的解决方案。 -
您已经将轮子重新发明成三角形。查看其他 cmets 并使用组合 ;-)
-
嗯,是的,你们都说得对。我已经对此进行了重构以避免依赖(vector 的子类仅提供了一种流式传输内容的方法,这更好地实现为 A 的成员函数)。感谢您将我踢向正确的方向...
-
这些流媒体方法作为非会员可能会更好。对象很棒,但有时命名空间中的模板函数更好。