gpt4 book ai didi

c++ - 使用 boost::shared_ptr 重载构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 14:14:26 27 4
gpt4 key购买 nike

考虑以下 .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 called after throwing an instance of 'boost::exception_detail::clone_impl

' what(): tr1::bad_weak_ptr

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

谁能解释一下?

最佳答案

问题是您在 B 的构造期间调用了 shared_from_this(),这是被禁止的,因为当时指向 B 的共享指针尚未初始化。

具体来说,这个构造函数就是您要调用的构造函数:

B::B(boost::shared_ptr<A> a_ptr) {
Init(2, a_ptr); // runtime error -- Init(...) calls shared_from_this!
}

回答第 2 部分:

我怀疑您已经习惯了另一种语言 :) 在 C++ 中,您不能按照您尝试的方式调用另一个构造函数。线路

B(2, a_ptr);

并没有按照您的想法行事——它所做的只是构造一个立即销毁的临时 B 对象。它不会调用其他构造函数。因此,您最终得到的 B 仍然具有默认构造的 a_ptr_ 成员。

C++-11,如果你的编译器支持的话,有委托(delegate)构造函数,看起来像这样:

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

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

关于c++ - 使用 boost::shared_ptr 重载构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com