我想在创建箱子对象时创建数量可变的Treasure对象。这是我想出的解决方案。要创建n个宝藏的数组,稍后将根据需要进行解析。有改善的空间吗?
Chest::Chest (int n) {
Treasure * tArr = new Treasure[n];
}
每个宝藏都有一个唯一的ID,然后解析为一个映射,将int ID映射到Treasure。
答案 0 :(得分:1)
您的变量tArr
是构造函数的本地对象,构造结束后将丢失,从而导致内存泄漏。
因此,如果您希望此代码有用,则需要使tArr
成为成员变量,并避免在构造函数中重新定义它。
Chest::Chest (int n) {
tArr = new Treasure[n]; // assuming Treasure *tArr is a class variable
}
第一个改进是实现rule of 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。
假设ID是连续的并且在Chest
本地,那么向量就是您所需要的:索引将是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
Cector更加简单。因此,只有在确实合理的情况下,才可以使用地图。