为什么 weak_from_this() 总是返回空的弱指针
Why weak_from_this() always returns empty weak pointer?
我正在尝试编写简单的父子类,并尝试为其使用智能指针。
我听说在构造函数中使用shared_from_this()
不好,所以我把它放在connect()
方法中。但是当我在此方法中调用weak_from_this()
时,它会返回空的弱指针。
我不知道我做错了什么,请帮忙:(
#include <iostream>
#include <memory>
#include <list>
#include <sstream>
using namespace std;
class Base : protected enable_shared_from_this<Base> {
public:
weak_ptr<Base> parent;
virtual void connect() {}
virtual void replaceChild(shared_ptr<Base> oldChild, shared_ptr<Base> newChild) {}
void setParent(weak_ptr<Base> parent) {
this->parent = parent; // <-- passed to here, but always empty
}
virtual string toString() { return "Base"; }
};
class Item : public Base {
public:
string toString() { return "Item"; }
};
class Item2 : public Base {
public:
void connect() {
if (auto parent = this->parent.lock()) {
parent->replaceChild(this->shared_from_this(), make_shared<Item>());
}
}
string toString() { return "Item2"; }
};
class Container : public Base {
public:
list<shared_ptr<Base>> items;
void connect() {
for (auto &item : items) {
weak_ptr<Base> ptr = this->weak_from_this();
item->setParent(ptr); // <-- ptr is empty here, according to debugger breakpoint
item->connect();
}
}
void replaceChild(shared_ptr<Base> oldChild, shared_ptr<Base> newChild) {
for (auto &item : items) {
if (item == oldChild) {
item = newChild;
item->setParent(this->weak_from_this());
item->connect();
break;
}
}
}
string toString() {
ostringstream ss;
ss << "Container(";
for (auto item : items) {
if (item != *items.begin()) ss << ", ";
ss << item->toString();
}
ss << ")";
return ss.str();
}
};
int main(int argc, char ** argv) {
shared_ptr<Base> base = make_shared<Container>();
if (auto cont1 = dynamic_pointer_cast<Container>(base)) {
cont1->items.push_back(make_shared<Item2>());
cont1->items.push_back(make_shared<Base>());
cont1->items.push_back(make_shared<Container>());
}
base->connect();
cout << base->toString() << endl;
return 0;
}
预期产出:
Container(Item, Base, Container())
实际输出:
Container(Item2, Base, Container())
因为Item2
有空parent
.
感谢@rafix07!!!更改为protected
public
,它有效!!
相关文章:
- 在函数中返回无符号字符数组,但不返回指针
- 为什么需要返回指针来利用协方差?
- 野牛如何在解析树中返回指针
- 何时返回指针与返回对象的一般经验法则?
- 为什么使用 std::istream_iterator 构造函数返回指针
- 为什么我不能直接从返回指针的函数返回对指针的引用?
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 函数返回动态强制转换的指针,返回指针,就好像它根本没有被转换一样
- 从函数返回对指针的引用与返回指针相同?
- C++ 为什么访问数组中的元素会返回指针?
- 关于函数返回指针
- 返回指针或对私有成员的引用的替代方法
- 从函数返回指针
- 通过从当地的C风格阵列中返回指针来获取一个悬空的指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 为什么C 模板功能不支持返回指针
- 返回指针的语句 - 解释它是如何工作的以及为什么