当一个胸部物体被创建时,我想要创建一个可变数量的宝物。这就是我想出的解决办法。若要创建n个宝藏数组,稍后将根据需要进行分析。还有改进的余地吗?
Chest::Chest (int n) {
Treasure * tArr = new Treasure[n];
}每个宝藏都有一个唯一的ID,然后被解析成一张地图,将int ID映射到宝藏。
发布于 2019-03-16 11:12:27
0级改进:避免丢失所创建的对象
变量tArr是构造函数的本地对象,在构造结束时将丢失,从而导致内存泄漏。
因此,如果希望这段代码有用,就需要使tArr成为一个成员变量,并避免在构造函数中重新定义它。
Chest::Chest (int n) {
tArr = new Treasure[n]; // assuming Treasure *tArr is a class variable
}1级改进:3的规则
第一个改进是实现第3条规则。否则,您很快就会遇到麻烦,例如,如果您意外地复制了一个Chest。
第2级改进:忘记数组和使用向量
数组是C++的中世纪。使用向量代替:
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 !!! 3级改进:使用地图
以下意图尚不完全清楚:
每个宝藏都有一个唯一的ID,然后被解析成一张地图,将int ID映射到宝藏。
假设ID是顺序的,并且是Chest的本地ID,那么向量就是您所需要的:索引将是ID。
但是,如果ID不是顺序的,或者不是胸部局部的,您可能对一个地图感兴趣,它是一种关联数组:
std::map<int, Treasure> myMap; // maps an int ID to a Treasure. 问题是,您不能只创建一个包含n个元素的映射:您需要一个接一个地添加元素:
myMap[id] = Treasure(...); // changes the element with id, or creates it克克托简单多了。所以,只有当地图确实是正确的时候,才去看地图。
https://stackoverflow.com/questions/55194796
复制相似问题