在另一个类的构造函数中创建n个对象的最佳方法?

时间:2019-03-16 08:16:10

标签: c++ dynamic constructor

我想在创建箱子对象时创建数量可变的Treasure对象。这是我想出的解决方案。要创建n个宝藏的数组,稍后将根据需要进行解析。有改善的空间吗?

Chest::Chest (int n) {

Treasure * tArr = new Treasure[n];

}

每个宝藏都有一个唯一的ID,然后解析为一个映射,将int ID映射到Treasure。

1 个答案:

答案 0 :(得分:1)

第0级改进:避免丢失您创建的对象

您的变量tArr是构造函数的本地对象,构造结束后将丢失,从而导致内存泄漏。

因此,如果您希望此代码有用,则需要使tArr成为成员变量,并避免在构造函数中重新定义它。

Chest::Chest (int n) {
    tArr = new Treasure[n];    // assuming Treasure *tArr is a class variable
}

1级改进:3的规则

第一个改进是实现rule of 3。否则,您会很快遇到麻烦,例如,如果您偶然复制了Chest

2级改进:不用数组,而使用向量

数组是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 !!!  

3级改进:使用地图

以下意图并不十分清楚:

  

每个宝藏都有一个唯一的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更加简单。因此,只有在确实合理的情况下,才可以使用地图。

相关问题