【问题标题】:Replacement of Poco::AutoPtr with boost用 boost 替换 Poco::AutoPtr
【发布时间】:2013-03-23 04:37:37
【问题描述】:

我正在尝试用 boost 中的一些替代方法替换 Poco::AutoPtr。以下是我目前发现的:

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

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

类的简化版本如下所示

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 是这种用法的正确智能指针吗?如果是的话..有人可以给我关于如何使用它的建议吗?

【问题讨论】:

  • 嗨。你找到解决办法了吗?
  • 不..如果我尝试更改,我会疯狂崩溃..所以暂时我在我的代码中复制了 poco 类并替换了原子计数器。它工作正常atm。稍后我将进行第二次尝试。

标签: boost shared-ptr smart-pointers poco-libraries


【解决方案1】:

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

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

在支持参数相关查找的编译器上, 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多