C++ 使用boost::shared\u ptr重载构造函数

C++ 使用boost::shared\u ptr重载构造函数,c++,boost,shared-ptr,C++,Boost,Shared Ptr,考虑以下.h文件: #ifndef COM_H_ #define COM_H_ #include <boost/enable_shared_from_this.hpp> #include <boost/shared_ptr.hpp> #include <map> class B; class A : public boost::enable_shared_from_this<A>{ public: A(){} ~A(){}

考虑以下.h文件:

#ifndef COM_H_
#define COM_H_

#include <boost/enable_shared_from_this.hpp>
#include <boost/shared_ptr.hpp>
#include <map>

class B;

class A : public boost::enable_shared_from_this<A>{
public:
    A(){}
    ~A(){}

    void Init();

    boost::shared_ptr<B> b_ptr_;
};

class B : public boost::enable_shared_from_this<B>{
public:

    B(){}
    B(boost::shared_ptr<A> a_ptr);
    B(int j, boost::shared_ptr<A> a_ptr);
    ~B(){}

    void Init();
    void Init(boost::shared_ptr<A> a_ptr);
    void Init(int j, boost::shared_ptr<A> a_ptr);

    std::string b;
    boost::shared_ptr<A> a_ptr_;
};
#endif /* COM_H_ */
和.cc文件:

#include "com.h"

void A::Init() {

    // Case 1 not working
    // boost::shared_ptr<B> b1(new B(shared_from_this()));
    // b1->Init();

    // Case 2 working
    boost::shared_ptr<B> b2(new B());
    b2->Init(shared_from_this());
}

B::B(boost::shared_ptr<A> a_ptr) {
    B(2, a_ptr);
}

B::B(int j, boost::shared_ptr<A> a_ptr) {
    a_ptr_ = a_ptr;
    b = "b";
}

void B::Init() {
    a_ptr_->b_ptr_ = shared_from_this();
}

void B::Init(boost::shared_ptr<A> a_ptr) {
    Init(2, a_ptr);
}

void B::Init(int j, boost::shared_ptr<A> a_ptr) {

    a_ptr_ = a_ptr;
    b = "b";
    a_ptr_->b_ptr_ = shared_from_this();
}
大体上:

#include "com.h"
#include <iostream>
int main() {

    boost::shared_ptr<A> a(new A());
    a->Init();

    std::cout << a->b_ptr_->b << std::endl;

    return 0;
}
将boost::shared_ptr传递给构造函数,然后使用与参数相同的指针调用另一个重载构造函数时,由shared_ptr指向的对象将丢失,并返回错误

在抛出的实例后调用terminate 'boost::异常\详细信息::克隆\执行

'什么:tr1::坏的\u弱的\u ptr

被抛出。当以相同的方式调用两个重载函数Init时,不会发生同样的情况


有人能解释一下吗?

问题是,在B的构造过程中,您正在从_调用shared_,这是禁止的,因为指向B的共享指针当时尚未初始化

具体来说,此构造函数就是您正在调用的构造函数:

B::B(boost::shared_ptr<A> a_ptr) {
    Init(2, a_ptr);  // runtime error -- Init(...) calls shared_from_this!
}
它不是在做你想做的事情——它所做的只是构造一个临时的B对象,它会立即被销毁。它不会调用另一个构造函数。所以你得到的是一个B,它仍然有一个默认构建的a_ptr_成员

如果您的编译器支持,C++-11具有委托构造函数,如下所示:

B(shared_ptr<A> a_ptr) : B(2, a_ptr) {...}

。。。否则,您必须声明另一个函数,并让两个构造函数调用它。

好的,您是对的!我编辑了代码,以便您提到的构造函数调用重载构造函数,其中未调用shared_from_this。现在我得到一个断言失败的错误:px!=0,函数运算符->,文件/usr/local/include/boost/smart_ptr/shared_ptr.hpp,第414行。就在那里,我编辑了原始帖子。构造函数不再调用Init,它调用B2,a_ptr。B::B boost::shared_ptr a_ptr{B2,a_ptr;}@apon好的,我想我看到了另一个问题,看到了我的答案编辑。好的,这就解释了!谢谢!
B(shared_ptr<A> a_ptr) : B(2, a_ptr) {...}