为什么不能像这样动态地在C++中声明一个对象数组:

Kai*_*zay 5 c++ arrays dynamic-arrays

在我的C++项目中,有一个类需要创建一个对象数组.在类的不同实例之间,数组的大小将不同,这就是我选择使用数组的原因.

如果我做 :

int numberOfPlayers; // This is determined at run time.
int *players; 

//In constructor
players= new int[numberOfPlayers]; // This works
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

Character *players;
players = new Character[numberOfPlayers]; // Compiler complains
Run Code Online (Sandbox Code Playgroud)

编译器抱怨"没有用于初始化Character的匹配构造函数"

如何动态声明"Character"类型的数组.

注意:字符与char无关.Character是我自己创建的类的名称.

编辑:字符没有默认构造函数,因为它需要传递几个参数,因此可以使用正确的状态进行初始化.唯一的构造函数有几个参数.

编辑:我在一个向量上选择了一个动态创建的数组,因为我知道在实例的生命周期中,数组的大小将是常量,但在不同的实例之间,大小将是不同的.我认为这对性能原因(内存/速度)有意义.

mil*_*bug 8

"正确"的方式是使用std::vector.它是一种快速,安全,可靠的替代方案new.

std::vector<Character> vec;
vec.push_back(Character(params));
vec.push_back(Character(other_params));
Run Code Online (Sandbox Code Playgroud)

如果您知道前面的大小,则可以通过使用避免重新分配开销 std::vector::reserve

std::vector<Character> vec;
vec.reserve(50);
vec.push_back(Character(params));
vec.push_back(Character(other_params));
Run Code Online (Sandbox Code Playgroud)

std::vector实际上开销几乎不存在.

现在,你不能按照你的方式做到这一点,这是因为默认new使用默认构造函数,它不存在.

  • `emplace_back`避免临时.例如`vec.emplace_back(params);` (2认同)