参考对象的向量?

时间:2014-01-23 02:05:36

标签: c++ c++11 object-lifetime

我有一个与此类似的课程设置:

class BlimpBase{
public:
    virtual ~BlimpBase();

private:
    virtual void lift()const = 0;
};

class Blimp: protected BlimpBase{
    void lift()const;
};

class BlimpCarrier{
public:
    add_blimp(BlimpBase& blimp);

private:
    std::vector<BlimpBase* blimp> blimps;
};

正如你所看到的,我有一组多态blimp类,我试图通过使用指针存储在向量中的“引用”(我意识到你不能在向量中存储引用,我只是不知道如何形容他们)。问题是大多数这些对象都作为类成员分配在堆栈上,但是我想将它们添加到这个向量中,以便我可以直接修改它们(副本不会这样做)。保持指向这些对象的问题是,如果这些对象在BlimpCarrier之前超出范围(因为它们在堆栈上),我将有一个悬空指针。我查看了std::unique_ptrstd::shared_ptr,但我认为我不能在这里使用它们......

1 个答案:

答案 0 :(得分:0)

假设您可以更改在堆栈上分配的位置,或者将它们作为成员分配的类,那么您可以尝试使用std :: weak_ptr:

class BlimpCarrier{
public:
    add_blimp(std::shared_ptr<BlimpBase>& blimp_ptr)
    {
        blimps.push_back(blimp_ptr);
    }

private:
    std::vector<std::weak_ptr<BlimpBase>> blimps;
};

BlimpCarrier globalCarrier;

void foo()
{
    std::shared_ptr<BlimpBase> instance(new BlimpSubClass());
    globalCarrier.add_blimp(instance);
}

您需要一个额外的步骤,当您遍历向量时,检查weak_ptr对象是否已“过期”,然后自己从向量中移除它们。我实际上建议使用std::list代替这种类型的链接列表实现。有关如何正确安全地使用weak_ptr的详细示例,请参阅cppreference.com