在 C++ 中的类构造函数中初始化结构数组
Posted
技术标签:
【中文标题】在 C++ 中的类构造函数中初始化结构数组【英文标题】:initilize a struct array in a class constructor in c++ 【发布时间】:2012-10-15 05:51:19 【问题描述】:我的头文件中有一个结构
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]”时类型不兼容
知道如何解决这个问题吗?
【问题讨论】:
【参考方案1】:这不是初始化数组,而是分配它。要初始化它,你需要一个成员初始化器:
Layer::Layer(unsigned int size) : myarray(new Foo[size])
但是,这不会编译,因为您有一个数组,需要使用编译时已知的一个大小进行初始化(如果未指定维度,则通过初始化列表),并且该大小不能改变。改用向量:
std::vector<Foo> myarray;
Layer::Layer(unsigned int size) : myarray(size)
如果向量不是一个选项,您至少需要一个指针才能指向 new
它,但是随后开始应用三/五规则的东西,这一切都变得一团糟。如果可以,请坚持使用向量。
【讨论】:
+1 对 std::vector 的踢球。幸运的是,他迟早会注意到这一点。【参考方案2】:struct Foo myarray[];
应该是struct Foo *myarray;
,如果您打算以动态方式使用它。否则,如果您希望它是一个未指定的静态,我认为它必须有一个初始化列表。
【讨论】:
【参考方案3】:将 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 现在指向该数组的地址。
【讨论】:
以上是关于在 C++ 中的类构造函数中初始化结构数组的主要内容,如果未能解决你的问题,请参考以下文章