gpt4 book ai didi

c++ - 对象指针 vector ,初始化

转载 作者:太空狗 更新时间:2023-10-29 20:47:21 25 4
gpt4 key购买 nike

我对 C++ 还不是很熟悉,所以如果这是基础知识,请多多包涵。

我有一些类似下面的代码。 L是一个抽象类(它有一些纯虚函数),ABC都是从 L 派生的常规类。这些可能有任意数量,而且它们都是不同的。

int main() {
// ...

std::vector<L*> ls(3) ;

ls[0] = new A ;
ls[1] = new B ;
ls[2] = new C ;

int i ;
for (i = 0 ; i < ls.size() ; i++) {
if (ls[i]->h()) {
// ...
}
}

// ...
}

它有效,但确实必须有更好的方法来初始化该 vector 。对吧?

vector 在首次初始化后不应更改。然而,我想我不能让它成为 const,因为各种对象本身可能在内部发生变化。我在常规数组上选择了一个 vector ,因为我不想手动跟踪它的长度(事实证明这很容易出错)。

理想情况下,我想将 vector 的定义和初始化从 main 中提取出来,最好放入一个单独的文件中,然后我可以使用 #include。当我尝试编译器时,它会提示“在‘=’标记之前需要构造函数、析构函数或类型转换”。所有类 ABC 都有默认构造函数。

此外,我的印象是我必须手动删除使用new创建的任何内容,但它不会删除ls deletedelete[]。如果我尝试 delete ls;,编译器会提示“type ‘class std::vector >’ argument given to ‘delete’, expected pointer”。

以上是安全的还是会导致一些内存问题?

最佳答案

but there really has to be a better way to initialise that vector. Right?

我不这么认为,至少在没有 C++0x 的情况下不会。你更喜欢哪种方式?您的初始化代码完全没问题。

I figure I can't make it const, however, because the various objects may themselves change internally.

你仍然可以让 vector 本身const,只是它的成员类型不能是指向const的指针。

I picked a vector over a regular array because I don't want to manually keep track of its length (that proved error prone).

您不必跟踪常量数组的长度:

L* ls[] = { new A, new B, new C };
// with <boost/range/size.hpp>
std::size_t num = boost::size(ls);
// without Boost, more error-prone
// std::size_t num = sizeof ls / sizeof ls[0];

通常你不需要尺寸,例如使用 Boost.Range。

Ideally I'd like to pull the definition and initialisation of the vector out of main and preferably into a separate file that I can then #include.

这将违反单一定义规则。您可以将声明放在头文件中,但定义必须放在源文件中。

Also, I was under the impression that I have to manually delete anything created using new, but it won't delete ls with either delete or delete[].

您的印象是正确的,但是您没有使用 new 创建 ls,只有它的元素。使用 vector 后,您必须删除它的每个元素,但不能删除 vector 本身。

保存多态指针的 STL 容器的推荐替代方案是 Boost pointer container library .

关于c++ - 对象指针 vector ,初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5940780/

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