C++存储基类指针的向量

C++ vector storing base class pointers

本文关键字:向量 指针 基类 存储 C++      更新时间:2023-10-16

好的,情况:我正在使用一个我无法控制的库,它有一个方法 createSomeObject()。此方法返回指向具有纯虚函数的抽象基类的指针,并且它没有复制构造函数,因此我无法自己实例化它,也无法复制它(显然)。

我需要在一个向量中存储一些(假设 10 个),所以我尝试执行以下操作:

vector<AbstractBaseClass*> v(10);
for(int i = 0; i < 10; i++)
{
    v.push_back(library->createSomeObject());
}

一旦这个循环结束,向量就会被损坏的指针填充。

我尝试了以下方法:

vector<AbstractBaseClass*> v(10);
for(int i = 0; i < 10; i++)
{
    AbstractBaseClass* abc = library->createSomeObject();
    v.push_back(abc);
}

无济于事。 我一定是疯了,或者在这里做了什么严重的错误。 我环顾四周,但答案总是使用 boost::shared_ptr。 可能是一个很好的解决方案,但我不能保证它会在构建它的机器上,所以我想避免将 Boost 与代码打包在一起。

我错过了什么吗? 我觉得我只是忘记了一些简单的事情,因为我想不出其中一个不起作用的原因。

当你这样做时:

vector<AbstractBaseClass*> v(10);

您已经在创建一个包含 10 个 (NULL) 指针的向量。因此,在你调用 push_back 之后,你将得到一个包含 20 个指针的向量,其中前 10 个指针无效。

如果您事先知道尺寸:

vector<AbstractBaseClass*> v(10);
for(int i = 0; i < 10; i++)
{
    v[i] = library->createSomeObject();
}
或者

,或者,在创建空向量后调用reserve