Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在另一个类中创建n个对象的最佳方法';建造师?_C++_Dynamic_Constructor - Fatal编程技术网

C++ 在另一个类中创建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设置为成员变量

我想在创建胸部对象时创建数量可变的宝藏对象。这就是我想出的解决办法。创建一个包含n个宝藏的数组,稍后根据需要进行解析。还有改进的余地吗

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