如何在循环中创建具有自身实例指针的对象?

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)。