class B { public: B(int value) : value_(value) {} int getValue() const { return value_; } private: int value_; }; class A { public: void setB(shared_ptr<B> b) { pb_ = b; } void doSomething() { if (auto p = pb_.lock()) cout << "A::doSomething() called, B's value is " << p->getValue() << endl; else cout << "B has been deleted" << endl; } private: weak_ptr<B> pb_; }; int main() { shared_ptr<A> pa = make_shared<A>();//先创建对象A和B shared_ptr<B> pb = make_shared<B>(42); pa->setB(pb);//将对象B传递给A(这里使用weak_ptr传递) pa->doSomething(); pb.reset(); pa->doSomething(); return 0; }完整注释
时间: 2024-03-30 20:38:43 浏览: 41
这段代码是关于 C++ 中智能指针的使用示例。类 B 表示一个带有一个 int 类型成员 value_ 的类,类 A 中使用 weak_ptr 来持有一个 B 类型的对象的引用,同时也提供了一个接口 setB 来设置 B 类型对象的引用。在 main 函数中,首先创建了 A 和 B 类型的对象,然后将 B 对象传递给 A 对象(使用 weak_ptr 传递),并调用了 A 对象的 doSomething 函数打印 B 对象的 value_ 值。接着,调用 reset 函数将 B 对象的引用计数减一,此时 B 对象的引用计数为 0,会被自动销毁。再次调用 A 对象的 doSomething 函数时,由于 B 对象已经被销毁,会打印出 "B has been deleted"。
具体来说,代码中首先定义了两个类 B 和 A,类 B 中有一个 int 类型成员变量 value_,类 A 中有一个 weak_ptr 类型成员变量 pb_,也有一个 setB 函数用来设置 pb_ 指向的对象。在 A 类中,doSomething 函数首先通过 pb_ 获取 shared_ptr 对象 p,如果 p 不为空,则打印出 B 对象的 value_ 值,否则打印出 "B has been deleted"。在 main 函数中,首先使用 make_shared 函数创建了 A 和 B 类型的对象 pa 和 pb,然后将 pb 传递给 pa 的 setB 函数,同时调用 pa 的 doSomething 函数打印出 B 对象的 value_ 值。然后调用 pb 的 reset 函数将 B 对象的引用计数减一,此时 B 对象的引用计数为 0,会被自动销毁。最后再次调用 pa 的 doSomething 函数时,由于 B 对象已经被销毁,会打印出 "B has been deleted"。
阅读全文