【问题标题】:How do you create objects that have an instance pointer of itself in a loop?如何在循环中创建具有自身实例指针的对象?
【发布时间】:2021-02-01 19:23:05
【问题描述】:

我有以下课程:

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

【问题讨论】:

    标签: c++ for-loop object stdvector


    【解决方案1】:

    问题出在构造函数中:

    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参数不需要通过引用传递]

    我建议您使用 smart 指针,而不是使用普通指针,例如 std::unique_ptr。然后你就不必担心需要自己的复制构造函数、析构函数或类似的东西了:

    std::unique_ptr<Worker> m_worker;
    

    这将使Worker 对象无法复制。如果您需要复制,请改用std::shared_ptr(和std::make_shared)。

    【讨论】:

    • 这种替代方法行不通。 Worker 类不能有 Worker 作为成员变量。
    • @NathanPierson 我想现在该睡觉了... :)
    • 我怀疑试图弄乱智能指针的寿命会变得太复杂。如果打算让工人配对,我建议使用具有两个Worker 成员变量的class WorkerPair;。特别是如果合作伙伴关系应该是互惠的。
    • 除了自己定义make_unique 之外,有没有不使用make_unique 的方法?我在 C++11 上。另外,将这个m_partner(std::make_unique&lt;Worker&gt;(std::move(partner))) 放在初始化列表中会给我错误'Worker' does not refer to a value
    • @Neosapien 然后m_worker(new Worker(std::move(partner)))?应该适用于智能和非智能指针。但请注意,如果使用非智能指针,您需要自己处理复制等。
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多