用boost替换Poco::AutoPtr

用boost替换Poco::AutoPtr,boost,shared-ptr,smart-pointers,poco-libraries,Boost,Shared Ptr,Smart Pointers,Poco Libraries,我正试图用boost中的一些替代品来替换Poco::AutoPtr。以下是我迄今为止的发现: 我拥有的:下面的classess正在与Poco::AutoPtr一起使用。他们需要通过实现duplicate()和release()方法来实现引用计数方法 我使用上面的代码>参考文献> h 和 POCO:AutoPTR/COD>在一个具有多重继承和C++菱形问题的复杂类层次结构中。p> 类的简化版本如下所示 class A : virtual public ReferenceCounted { ...

我正试图用boost中的一些替代品来替换
Poco::AutoPtr
。以下是我迄今为止的发现:

我拥有的:下面的classess正在与
Poco::AutoPtr
一起使用。他们需要通过实现
duplicate()
release()
方法来实现引用计数方法

我使用上面的代码>参考文献> h <代码>和<代码> POCO:AutoPTR/COD>在一个具有多重继承和C++菱形问题的复杂类层次结构中。p> 类的简化版本如下所示

class A : virtual public ReferenceCounted
{
...
}

class B : public A
{
...
}

class C : public A
{
...
}

class D : public A, B
{
...
}
这个名单还有几层。我知道这需要用简化的层次结构进行重构,但我想先在boost中进行适当的替换,删除
Poco::AutoPtr

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

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

还有一个问题是,我需要多次从基类向派生类进行类型转换

是侵入式的吗?ptr是这种用法的正确智能指针吗?如果是的话。。有人能给我建议如何使用相同的吗

然而,我无法用这个方法实施正确的解决方案 因为侵入式_ptr需要侵入式_ptr_add_ref和 专门为具有 我需要使用指针

不,不,不应该很难。正如上面所说:

在支持参数相关查找的编译器上, 应在中定义侵入式\u ptr\u添加\u参考和侵入式\u ptr\u发布 与其参数对应的名称空间;否则,将 定义需要进入命名空间boost

试试这个:main.cpp(使用“g++main.cpp-o main-lboost_系统”构建的)

#包括
类MyObject
{
公众:
void duplicate(){
// ...
}
无效释放(){
// ...
}
};
名称空间提升{
模板
无效侵入性添加参考(T*po){
po->duplicate();//您的内部实现
}
模板
无效侵入性ptr释放(T*po){
采购订单->发布();
}
}        
int main(int argc,字符**argv)
{
// ...
boost::侵入性的ptr ptr(新的MyObject);
boost::intrusive_ptr ptr2=ptr;//应该可以工作
}
然而,我无法用这个方法实施正确的解决方案 因为侵入式_ptr需要侵入式_ptr_add_ref和 专门为具有 我需要使用指针

不,不,不应该很难。正如上面所说:

在支持参数相关查找的编译器上, 应在中定义侵入式\u ptr\u添加\u参考和侵入式\u ptr\u发布 与其参数对应的名称空间;否则,将 定义需要进入命名空间boost

试试这个:main.cpp(使用“g++main.cpp-o main-lboost_系统”构建的)

#包括
类MyObject
{
公众:
void duplicate(){
// ...
}
无效释放(){
// ...
}
};
名称空间提升{
模板
无效侵入性添加参考(T*po){
po->duplicate();//您的内部实现
}
模板
无效侵入性ptr释放(T*po){
采购订单->发布();
}
}        
int main(int argc,字符**argv)
{
// ...
boost::侵入性的ptr ptr(新的MyObject);
boost::intrusive_ptr ptr2=ptr;//应该可以工作
}

Hi。你找到解决办法了吗?没有。。如果我试图改变,我会崩溃。。因此,目前我在代码中复制了poco类,并替换了原子计数器。它在自动取款机上工作得很好。我以后会再做的。嗨。你找到解决办法了吗?没有。。如果我试图改变,我会崩溃。。因此,目前我在代码中复制了poco类,并替换了原子计数器。它在自动取款机上工作得很好。我以后再做。
#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
}