我想在创建箱子对象时创建数量可变的Treasure对象。这是我想出的解决方案。要创建n个宝藏的数组,稍后将根据需要进行解析。有改善的空间吗?
Chest::Chest (int n) {
Treasure * tArr = new Treasure[n];
}
每个宝藏都有一个唯一的ID,然后解析为一个地图,将int ID映射到Treasure。
您的变量tArr
是构造函数的本地对象,构造结束后将丢失,从而导致内存泄漏。
因此,如果您希望此代码有用,则需要制作tArr
一个成员变量,并避免在构造函数中重新定义它。
Chest::Chest (int n) {
tArr = new Treasure[n]; // assuming Treasure *tArr is a class variable
}
第一项改进是实施3的规则。否则,您会很快遇到麻烦,例如,如果您偶然复制了Chest
。
数组是C ++的中世纪。改用vector:
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()
:
Treasure x(...); // create a cool treasure not just default initialized
tArr.push_back(x); // add it at the end of the vector
例如,如果统一的宝藏太无聊,这可能允许您在构造函数中添加随机的宝藏。
但是您也可以将resize()
它放在任意值上:
tArr.resize(tArr.size()*2); // two times more treasures !!!
以下意图并不十分清楚:
每个宝藏都有一个唯一的ID,然后解析为一个地图,将int ID映射到Treasure。
假设ID是顺序的且在本地Chest
,则只需向量即可:索引将是ID。
但是,如果ID不是顺序的,或者不是胸部的本地ID,那么您可能会对map感兴趣,它是一种关联数组:
std::map<int, Treasure> myMap; // maps an int ID to a Treasure.
问题是您不能只创建其中包含n个元素的地图:您需要一个一个地添加元素:
myMap[id] = Treasure(...); // changes the element with id, or creates it
扇形区要简单得多。因此,只有在确实合理的情况下,才可以使用地图。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句