C++ 使用基类进行ref count和include循环的侵入式_ptr

C++ 使用基类进行ref count和include循环的侵入式_ptr,c++,boost,smart-pointers,C++,Boost,Smart Pointers,我正在使用boost::intrusive_ptr作为我的参考计数智能指针。我用的是这样的东西: 这似乎是一个好主意,因为它简化了一个新的引用计数类的声明,只是从它继承。问题在于提前声明。在很多地方,我想使用一个指向类定义中尚未定义的类型的指针,但这是不可能的,因为处理ref count的两个方法需要知道该类型是否从CRefCounted继承 如果我尝试在声明侵入性_ptr之前包含依赖项,这是可以的,但是之后,我会得到很多循环包含 您将如何处理这种情况 我认为您可以通过使用侵入式ptr\u a

我正在使用
boost::intrusive_ptr
作为我的参考计数智能指针。我用的是这样的东西:

这似乎是一个好主意,因为它简化了一个新的引用计数类的声明,只是从它继承。问题在于提前声明。在很多地方,我想使用一个指向类定义中尚未定义的类型的指针,但这是不可能的,因为处理ref count的两个方法需要知道该类型是否从CRefCounted继承

如果我尝试在声明侵入性_ptr之前包含依赖项,这是可以的,但是之后,我会得到很多循环包含


您将如何处理这种情况

我认为您可以通过使用
侵入式ptr\u add\u ref
侵入式ptr\u release
的模板函数来解决这个问题,如下所示:

namespace boost {
  template<class T> void intrusive_ptr_add_ref(T* p) { ++(p->references) }
  template<class T>void intrusive_ptr_release(T* p) { 
    if (--(p->references) == 0) 
      delete p 
  }
};
使用这些声明,您可以对前向声明的类(如

class A;
class B {
  ::boost::intrusive_ptr<A> _myPtr;
};
class A : public CRefCounted {
};
A类;
B类{
::boost::侵入式\u ptr\u myPtr;
};
A类:公共信用卡{
};

此解决方案有一个缺点(理论上…),即为
CRefCounted
的每个子类定义一对
add\u ref
/
release
函数,但我认为编译器无论如何都会选择使用内联,所以这可以忽略。

我一直在使用类似的RefCounted基类,我开始想为什么我从来没有遇到过这个问题。这是因为我倾向于在源文件中隐藏实现细节。考虑B类的以下头文件:

//File: B.h
#include <boost/intrusive_ptr.hpp>

class A;

class B
{
public:
    B();
    ~B();
    boost::intrusive_ptr<A> foo();
    void foo2(const boost::intrusive_ptr<A> p);
    boost::intrusive_ptr<A> p;
};

我不知道这对你是否有帮助,但这是需要考虑的

有点离题,但是链接中的CRefCounted类有一个严重的缺陷,因为它没有定义虚拟析构函数。我终于解决了这个问题。你的回答让我走上了正确的道路。我通常做和你一样的事。问题是这个愚蠢的苹果编译器给出了错误的错误信息。我从项目中提取了所有文件,并逐一添加,问题是类型未完成,只是转发声明。我在发布之前尝试了此解决方案,但没有解决问题,显然是因为编译器作弊。谢谢你的努力。
//File: B.h
#include <boost/intrusive_ptr.hpp>

class A;

class B
{
public:
    B();
    ~B();
    boost::intrusive_ptr<A> foo();
    void foo2(const boost::intrusive_ptr<A> p);
    boost::intrusive_ptr<A> p;
};
//File: B.cpp
#include "B.h"
#include "A.h" //Include header where A is defined.

B::B() { }
B::~B() { }

//Other member functions...