【发布时间】:2019-06-14 13:44:24
【问题描述】:
在我的程序中,组将共享指向主题的指针;和主题将对他们的组有弱指针。我希望 Group 有一个 join() 函数,将 Subject 的弱指针分配给它自己。下面是我尝试过的最小代码。如何修复 join() 函数?
#include <iostream>
#include <string>
#include <memory>
class Party;
class Subject
{
public:
std::weak_ptr<Party> MyParty;
};
class Party
{
public:
std::string Name;
void join(std::shared_ptr<Subject> subject)
{
subject->MyParty = std::make_shared<Party>(*this); // <---- PROBLEM
}
};
int main()
{
auto& BlueParty = std::make_shared<Party>();
BlueParty->Name = "Blue Party";
auto& Jane = std::make_shared<Subject>();
BlueParty->join(Jane);
if (auto ptr = Jane->MyParty.lock())
{
std::cout << "I am in " << ptr->Name << std::endl;
}
else { std::cout << "I have no party." << std::endl; }
return 0;
}
程序打印出“我没有派对”。如果分配成功,应该会打印出“我在蓝方”。
【问题讨论】:
-
您似乎在寻找
std::enable_shared_from_this。 -
问题是Party 并没有意识到它总是由一个shared_ptr 拥有。这不一定是坏事。一种选择是传入要加入的 Party 的 shared_ptr(可以设为静态类函数)。