我有一个与此类似的课程设置:
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_ptr
和std::shared_ptr
,但我认为我不能在这里使用它们......
答案 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。