如何在循环中创建具有自身实例指针的对象?
How do you create objects that have an instance pointer of itself in a loop?
我有以下 class:
class Worker
{
private:
const int m_id;
Worker* m_partner = nullptr;
public:
Worker(const int &id)
:m_id(id){}
Worker(const int &id, Worker partner)
:m_id(id)
{
m_partner = &partner;
}
}
当我像这样创建一个工人矢量时:
std::vector<Worker> workers;
workers.push_back(Worker(0, Worker(1)));
workers.push_back(Worker(2, Worker(3)));
workers.push_back(Worker(4, Worker(5)));
我得到了一个很好的工作伙伴对象向量,id 为 0-1、2-3 和 4-5。如何在 for 循环中创建它?当我尝试这个时:
for (int id = 0; id < 6; id += 2)
{
workers.push_back(Worker(id, Worker(id+1)));
}
所有主要工作人员都与合作伙伴 5 a.k.a 合作。最后创建的伙伴工作者对象。提前致谢。
问题出在构造函数中:
Worker(const int &id, Worker partner)
您将参数 partner
定义为 局部变量 ,当函数 returns.这意味着一旦构造函数 returns.
指向该变量的任何指针都将失效
您需要通过引用或作为指针传递此参数(只要您创建的 Worker
对象存在,原始对象就需要保持活动和有效)。
如果您传递给构造函数的对象不会存活足够长的时间(如问题中的示例所示),那么您需要制作 copy partner
对象:
Worker(const int id, Worker partner)
: m_id(id), m_partner(std::make_unique<Worker>(std::move(partner)))
{
}
[注意 id
参数不需要通过引用传递]
我建议您使用智能 指针,而不是使用普通指针,例如std::unique_ptr
。那么你就不必担心需要自己的复制构造函数、析构函数等:
std::unique_ptr<Worker> m_worker;
这将使 Worker
个对象无法复制。如果您需要复制,请改用 std::shared_ptr
(和 std::make_shared
)。
我有以下 class:
class Worker
{
private:
const int m_id;
Worker* m_partner = nullptr;
public:
Worker(const int &id)
:m_id(id){}
Worker(const int &id, Worker partner)
:m_id(id)
{
m_partner = &partner;
}
}
当我像这样创建一个工人矢量时:
std::vector<Worker> workers;
workers.push_back(Worker(0, Worker(1)));
workers.push_back(Worker(2, Worker(3)));
workers.push_back(Worker(4, Worker(5)));
我得到了一个很好的工作伙伴对象向量,id 为 0-1、2-3 和 4-5。如何在 for 循环中创建它?当我尝试这个时:
for (int id = 0; id < 6; id += 2)
{
workers.push_back(Worker(id, Worker(id+1)));
}
所有主要工作人员都与合作伙伴 5 a.k.a 合作。最后创建的伙伴工作者对象。提前致谢。
问题出在构造函数中:
Worker(const int &id, Worker partner)
您将参数 partner
定义为 局部变量 ,当函数 returns.这意味着一旦构造函数 returns.
您需要通过引用或作为指针传递此参数(只要您创建的 Worker
对象存在,原始对象就需要保持活动和有效)。
如果您传递给构造函数的对象不会存活足够长的时间(如问题中的示例所示),那么您需要制作 copy partner
对象:
Worker(const int id, Worker partner)
: m_id(id), m_partner(std::make_unique<Worker>(std::move(partner)))
{
}
[注意 id
参数不需要通过引用传递]
我建议您使用智能 指针,而不是使用普通指针,例如std::unique_ptr
。那么你就不必担心需要自己的复制构造函数、析构函数等:
std::unique_ptr<Worker> m_worker;
这将使 Worker
个对象无法复制。如果您需要复制,请改用 std::shared_ptr
(和 std::make_shared
)。