1

我正在尝试Poco::AutoPtr用 boost 中的一些替代方法来代替。这是我迄今为止发现的:

我所拥有的:以下类正在与Poco::AutoPtr. 他们需要使用实现duplicate()和方法来实现引用计数release()方法。

我在上面referece_counted.hPoco::AutoPtr复杂的类层次结构中使用多重继承和 C++ 菱形问题。

类的简化版本看起来像这样

class A : virtual public ReferenceCounted
{
...
}

class B : public A
{
...
}

class C : public A
{
...
}

class D : public A, B
{
...
}

并且列表继续深入几个层次。我知道这需要使用简化的层次结构进行重构,但我想Poco::AutoPtr首先在 boost 中通过适当的替换来删除:

到目前为止我发现了什么:我发现boost::intrusive_ptr是最接近的智能指针,可以很好地替代Poco::AutoPtr.

然而,我无法用这个实现正确的解决方案,因为 intrusive_ptr 需要专门为每个需要使用指针的类创建的 intrusive_ptr_add_ref 和 intrusive_ptr_release 方法。我尝试使用模板,但手头仍然没有合适的解决方案。

还有一个问题是我需要多次从基类转换为派生类。

intrusive_ptr 是这种用法的正确智能指针吗?如果是的话..有人可以给我关于如何使用它的建议吗?

4

1 回答 1

1

然而,我无法用这个实现正确的解决方案,因为 intrusive_ptr 需要专门为每个需要使用指针的类创建的 intrusive_ptr_add_ref 和 intrusive_ptr_release 方法。

不,不。这应该不难。正如Boost 文档所说:

在支持依赖参数查找的编译器上,intrusive_ptr_add_ref 和 intrusive_ptr_release 应该定义在与其参数对应的命名空间中;否则,定义需要进入命名空间 boost

试试这个:main.cpp(用“g++ main.cpp -o main -lboost_system”构建好)

#include <boost/intrusive_ptr.hpp>  

class MyObject
{
  public:
    void duplicate(){ 
       // ...
    }
    void release(){
       // ...
    }
};

namespace boost {

template <class T>
void intrusive_ptr_add_ref( T * po ) {
    po->duplicate(); // your internal realization
}

template <class T>
void intrusive_ptr_release( T * po ) {
    po->release(); 
}

}        

int main(int argc, char **argv)
{
    // ...
    boost::intrusive_ptr<MyObject> ptr( new MyObject );
    boost::intrusive_ptr<MyObject> ptr2 = ptr; // should work
}
于 2013-04-11T06:50:01.573 回答