首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个类的构造函数中创建n个对象的最佳方法?

在另一个类的构造函数中创建n个对象的最佳方法?
EN

Stack Overflow用户
提问于 2019-03-16 08:16:10
回答 1查看 132关注 0票数 1

当一个胸部物体被创建时,我想要创建一个可变数量的宝物。这就是我想出的解决办法。若要创建n个宝藏数组,稍后将根据需要进行分析。还有改进的余地吗?

代码语言:javascript
复制
Chest::Chest (int n) {

Treasure * tArr = new Treasure[n];

}

每个宝藏都有一个唯一的ID,然后被解析成一张地图,将int ID映射到宝藏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-16 11:12:27

0级改进:避免丢失所创建的对象

变量tArr是构造函数的本地对象,在构造结束时将丢失,从而导致内存泄漏。

因此,如果希望这段代码有用,就需要使tArr成为一个成员变量,并避免在构造函数中重新定义它。

代码语言:javascript
复制
Chest::Chest (int n) {
    tArr = new Treasure[n];    // assuming Treasure *tArr is a class variable
}

1级改进:3的规则

第一个改进是实现第3条规则。否则,您很快就会遇到麻烦,例如,如果您意外地复制了一个Chest

第2级改进:忘记数组和使用向量

数组是C++的中世纪。使用向量代替:

代码语言:javascript
复制
class Chest {
    std::vector<Treasure> tArr;     // naming could be discussed...
    ...
}; 

Chest::Chest (int n) : tArr(n) {    // construct the vector with n elements
               // now do whatever you want with these elements
}

现在矢量最酷的一点是它们可以动态生长。因此,您可以从一个空向量开始,并使用push_back()添加新的宝藏:

代码语言:javascript
复制
Treasure x(...); // create a cool treasure not just default initialized 
tArr.push_back(x);  // add it at the end of the vector

这可以让你在你的构造函数中添加随机的宝藏,如果统一的宝藏太无聊。

但是,您也可以在流中将其resize()为任意值:

代码语言:javascript
复制
tArr.resize(tArr.size()*2);   // two times more treasures !!!  

3级改进:使用地图

以下意图尚不完全清楚:

每个宝藏都有一个唯一的ID,然后被解析成一张地图,将int ID映射到宝藏。

假设ID是顺序的,并且是Chest的本地ID,那么向量就是您所需要的:索引将是ID。

但是,如果ID不是顺序的,或者不是胸部局部的,您可能对一个地图感兴趣,它是一种关联数组:

代码语言:javascript
复制
std::map<int, Treasure> myMap;  // maps an int ID to a Treasure. 

问题是,您不能只创建一个包含n个元素的映射:您需要一个接一个地添加元素:

代码语言:javascript
复制
myMap[id] = Treasure(...);      // changes the element with id, or creates it

克克托简单多了。所以,只有当地图确实是正确的时候,才去看地图。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55194796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档