在c ++中的类构造函数中初始化struct数组

时间:2012-10-15 05:51:19

标签: c++ arrays constructor struct initialization

我的头文件中有一个结构

 struct Foo{
     timeval t;
     struct Bar b;
 }

我在同一个头文件中还有另一个Bar,我也在头文件中声明了一个类。

 class Layer{
      public:
              ...
              ...
      private:
              struct Foo myarray[];
 }

我想在头文件中声明一个Foo数组,并在我的类构造函数中初始化它

 Layer::Layer(unsigned int size)
 {
       myarray = new Foo[size];
 }

但在编译时会返回错误。 错误:将'Foo *'赋值给'Foo [0]'

的类型不兼容

任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

那不是初始化数组,它正在分配它。要初始化它,您需要一个成员初始化器:

Layer::Layer(unsigned int size) : myarray(new Foo[size]){}

然而,这将无法编译,因为你有一个数组,需要在编译时使用一个已知的大小进行初始化(如果未指定维度,则通过初始化列表),并且该大小不能更改。改为使用向量:

std::vector<Foo> myarray;

Layer::Layer(unsigned int size) : myarray(size){}

如果向量不是一个选项,你至少需要一个指针才能new它,但随后三条/五条规则的东西开始应用,这一切都变得一团糟。如果可以的话,坚持使用矢量。

答案 1 :(得分:1)

struct Foo myarray[];如果你想以动态的方式使用它,应该是struct Foo *myarray;。否则,如果你想要它是一个未指定的静态我它必须有一个初始化列表。

答案 2 :(得分:0)

将myArray的声明更改为:

struct Foo * myArray;

您可以使用索引运算符(例如myarray [index])正常访问数组。您必须确保不会超出界限,即索引不得小于0或大于 size

myarray = new Foo[size];
myarray[0];  // Fine
myarray[-1];  // Crash!

myarray[size - 1];  // Also fine
myarray[size];  //  Another crash!

您还必须确保在删除它时使用delete []运算符而不是普通的删除运算符:

delete[] Foo;

您的代码失败的原因是编译器需要在编译时知道数组的大小,并且您尝试在运行时分配大小。将其更改为指针会告诉编译器您要指向内存地址。使用以下命令创建数组时:

myarray = new Foo[size];

在内存中分配一个新数组, myarray 现在指向该数组的地址。