确定构造函数初始值设定项中的数组大小

zar*_*tra 14 c++ arrays constructor initialization

在下面的代码中,我希望在调用Class构造函数时将数组定义为大小为x的数组.我怎样才能做到这一点?

class Class
{
public:
  int array[];
  Class(int x) : ??? { }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ond 47

你们这些人过于复杂了.当然你可以用C++做到这一点.他可以使用普通数组来提高效率.如果向量不提前知道阵列的最终大小,即它需要随着时间的推移而增长,那么它才有意义.

如果您可以知道链中的数组大小高一级,则模板化类是最简单的,因为没有动态分配且没有内存泄漏的可能性:

template < int ARRAY_LEN > // you can even set to a default value here of C++'11

class MyClass
  {   
  int array[ARRAY_LEN]; // Don't need to alloc or dealloc in structure!  Works like you imagine!   
  }

// Then you set the length of each object where you declare the object, e.g.

MyClass<1024> instance; // But only works for constant values, i.e. known to compiler
Run Code Online (Sandbox Code Playgroud)

如果您无法知道声明对象的位置的长度,或者如果要重用不同长度的同一对象,或者您必须接受未知长度,那么您需要在构造函数中分配它并将其释放你的析构函数......(理论上总是要检查以确保它有效......)

class MyClass
  {
  int *array;

  MyClass(int len) { array = calloc(sizeof(int), len); assert(array); }   
  ~MyClass() { free(array); array = NULL; } // DON'T FORGET TO FREE UP SPACE!
  }
Run Code Online (Sandbox Code Playgroud)


Căt*_*tiș 21

您无法使用无法在编译时计算的非const维度初始化数组的大小(至少在当前C++标准,AFAIK中不是这样).

我建议使用std::vector<int>而不是数组.它为大多数操作提供了类似于数组的语法.

  • vector <int>数组; Class(x):array(x){}; (2认同)

Joh*_*ing 12

使用new运算符:

class Class
{
   int* array;
   Class(int x) : array(new int[x]) {};
};
Run Code Online (Sandbox Code Playgroud)

  • 如果这样做,您还需要一个复制构造函数,赋值运算符和析构函数.使用std :: vector可以提供完全相同的功能,但不需要这些功能. (8认同)
  • 如果您使用此代码,请不要忘记在构造函数中调用delete []. (5认同)

AFo*_*lia 5

我认为这是不可能的。至少不是你想要的方式。当大小来自动态信息 (x) 时,无法创建静态大小的数组 (array[])。

您需要存储指向 int 的指针和大小,并重载复制构造函数、赋值运算符和析构函数来处理它,或者使用 std::vector。

class Class
{
  ::std::vector<int> array;
  Class(int x) : array(x) { }
};
Run Code Online (Sandbox Code Playgroud)


Mig*_*eon 5

你不明白吗,不需要使用向量,如果想使用数组,这是一个效率问题,例如更少的空间,没有复制时间(在这种情况下,如果处理得当,甚至不需要删除数组内的数组)析构函数)等,无论有什么原因。

正确答案是:(引用)

class Class
{
   int* array;
   Class(int x) : array(new int[x]) {};
};
Run Code Online (Sandbox Code Playgroud)

不要试图强迫人们使用非最佳替代方案,否则你会让没有经验的程序员感到困惑