C++ 在另一个类中创建n个对象的最佳方法';建造师?
我想在创建胸部对象时创建数量可变的宝藏对象。这就是我想出的解决办法。创建一个包含n个宝藏的数组,稍后根据需要进行解析。还有改进的余地吗C++ 在另一个类中创建n个对象的最佳方法';建造师?,c++,dynamic,constructor,C++,Dynamic,Constructor,我想在创建胸部对象时创建数量可变的宝藏对象。这就是我想出的解决办法。创建一个包含n个宝藏的数组,稍后根据需要进行解析。还有改进的余地吗 Chest::Chest (int n) { Treasure * tArr = new Treasure[n]; } 每个宝藏都有一个唯一的ID,然后解析成一个映射,将int ID映射到宝藏 0级改进:避免丢失已创建的对象 您的变量tArr是构造函数的本地对象,在构造结束时将丢失,从而导致内存泄漏 因此,如果希望此代码有用,则需要将tArr设置为成员变量
Chest::Chest (int n) {
Treasure * tArr = new Treasure[n];
}
每个宝藏都有一个唯一的ID,然后解析成一个映射,将int ID映射到宝藏 0级改进:避免丢失已创建的对象
您的变量tArr
是构造函数的本地对象,在构造结束时将丢失,从而导致内存泄漏
因此,如果希望此代码有用,则需要将tArr
设置为成员变量,并避免在构造函数中重新定义它
Chest::Chest (int n) {
tArr = new Treasure[n]; // assuming Treasure *tArr is a class variable
}
1级改进:3的规则
第一个改进是实施。否则,你会很快遇到麻烦,例如,如果你不小心复制了一个箱子
第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
}
例如,如果统一的宝藏太无聊,这可以允许您在构造函数中添加随机宝藏
但您也可以将其在流上转换为任意值:
tArr.resize(tArr.size()*2); // two times more treasures !!!
三级改进:使用地图
以下意图并不完全清楚:
每个宝藏都有一个唯一的ID,然后被解析成一个地图,映射
INTID值得珍惜
假设ID是顺序的,并且位于胸部
,那么向量就是您所需要的:索引就是ID
但是,如果ID不是连续的,或者不是胸部的局部ID,您可能会对a感兴趣,这是一种关联数组:
std::map<int, Treasure> myMap; // maps an int ID to a Treasure.
塞克托要简单得多。所以,只有当地图真的合理时,才去看它 “改进空间?”使用
std::vector
?如果以后要解析它,需要以某种方式存储它的大小。您还必须正确实现赋值运算符、复制和移动构造函数以及析构函数。只使用std::vector
可能更容易。
std::map<int, Treasure> myMap; // maps an int ID to a Treasure.
myMap[id] = Treasure(...); // changes the element with id, or creates it