我如何在以后实例化数组的大小?

Hob*_*ist 2 c++

假设我有一个名为的基类

Class Base {
public:
    std::string array[];
};
Run Code Online (Sandbox Code Playgroud)

字符串数组的大小在另一个类扩展之前没有决定,这样做的正确语法是什么?

EG,稍后在派生类中

Derived::Derived() {
    array[] = new array[40];
}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 8

如果要使用C样式数组,则必须在编译时修复并知道大小.即使在这种情况下,您也可以使用更安全,零开销的std::array<>包装器.

如果在编译时知道容器的大小,那么最好使用std::vector(或者std::deque在某些情况下,根据您在内存分配方面的要求)并避免通过原始指针进行手动内存管理,new[]并且delete[]:

#include <string> // For std::string
#include <vector> // For std::vector

class Base {
public:
    std::vector<std::string> myVector;
};
Run Code Online (Sandbox Code Playgroud)

此外,这种设计不需要在构造函数(和析构函数)中进行任何专门的工作Derived.如果所有由Derived默认构造函数完成的操作都是分配数组,那么现在你可以避免显式地定义一个默认的构造函数,让编译器隐式地为你生成一个 - 析构函数的相同故事.

另外,我不鼓励你使用标准容器类(如array)的名称作为变量的名称.像myArray(或者myVector,在我上面的例子中)的东西是更合适的选择.


Jos*_*eld 5

你不知道 C ++中的数组具有编译时固定的大小。您不能只是根据自己的喜好调整它们的大小。

仅使用语言功能执行此操作的坏方法是实际上将您的成员设置为std::string*

std::string* array;
Run Code Online (Sandbox Code Playgroud)

然后动态分配一个std::strings 数组,将指向第一个元素的指针分配给array

Derived::Derived() {
    array = new std::string[40];
}
Run Code Online (Sandbox Code Playgroud)

做到这一点的好方法是使用库功能。标准库提供了供您使用的容器类型。尝试std::vector<std::string>

std::vector<std::string> array;
Run Code Online (Sandbox Code Playgroud)

您可以初始化为包含40个字符串,如下所示:

Derived::Derived()
  : array(40)
{ }
Run Code Online (Sandbox Code Playgroud)