0

我有以下课程:

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 合作,也就是创建的最后一个合作伙伴工作人员对象。提前致谢。

4

1 回答 1

3

问题出在构造函数中:

Worker(const int &id, Worker partner)

您将参数定义partner局部变量,当函数返回时,它的生命周期将结束(并且对象被破坏)。这意味着一旦构造函数返回,任何指向此变量的指针都将变为无效。

您需要通过引用或作为指针传递此参数(并且只要Worker您创建的对象存在,原始对象就需要保持活跃和有效)。


如果您传递给构造函数的对象的存活时间不够长(如问题中的示例所示),那么您需要复制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(and std::make_shared)。

于 2021-02-01T19:27:10.030 回答