gpt4 book ai didi

c++ - 引用对象 vector ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:53 25 4
gpt4 key购买 nike

我有一个类似于此的类设置:

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;
};

如您所见,我有一组多态飞艇类,我试图通过使用指针将其作为“引用”存储在 vector 中(我知道您不能在 vector 中存储引用,我只是不知道如何描述它们)。问题是,这些对象中的大多数都作为类成员分配在堆栈上,但我想将它们添加到这个 vector 中,以便我可以直接修改它们(复制不行)。保留指向这些对象的指针的问题是,如果这些对象在 BlimpCarrier 超出范围之前超出范围(因为它们在堆栈上),我将得到一个悬空指针。我查看了 std::unique_ptrstd::shared_ptr,但我认为我不能在这里使用它们...

最佳答案

假设您可以更改它们在堆栈上的分配位置,或者将它们作为成员的类,那么您可以使用 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);
}

您需要一个额外的步骤,即当您遍历 vector 时检查 weak_ptr 对象是否已“过期”,然后自己将它们从 vector 中移除。我实际上建议使用 std::list 代替此类事物的链表实现。参见 cppreference.com有关如何正确和安全地使用 weak_ptr 的一个很好的例子。

关于c++ - 引用对象 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com