0

我的头文件中有一个结构

 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]' 时类型不兼容</p>

知道如何解决这个问题吗?

4

3 回答 3

2

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

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

但是,这不会编译,因为您有一个数组,需要使用编译时已知的一个大小对其进行初始化(如果未指定维度,则通过初始化列表),并且该大小不能更改。改用向量:

std::vector<Foo> myarray;

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

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

于 2012-10-15T05:55:25.907 回答
1

struct Foo myarray[];struct Foo *myarray;如果您打算以动态方式使用它,应该是这样。否则,如果您希望它是未指定的静态,我认为它必须有一个初始化列表。

于 2012-10-15T05:53:23.807 回答
0

将 myArray 的声明更改为:

struct Foo * myArray;

您可以使用索引运算符(例如 myarray[index] )正常访问数组。您必须确保不会越界访问它,即 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现在指向该数组的地址。

于 2012-10-16T09:30:06.210 回答