【问题标题】:Is there a boost or STL class that can wrap a member pointer if it was an member variable?如果它是成员变量,是否有可以包装成员指针的 boost 或 STL 类?
【发布时间】: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 的成员函数)。感谢您将我踢向正确的方向...
  • 这些流媒体方法作为非会员可能会更好。对象很棒,但有时命名空间中的模板函数更好。

标签: c++ boost stl


【解决方案1】:

boost::shared_ptr 是您尝试查找的内容吗?

【讨论】:

  • 不完全!我怀疑答案是没有现成的类可以这样做是有原因的——这不是一个好的设计模式!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多