初始化类构造函数初始化列表中的对象数组的第一个条目

Initialize first entries of an array of objects in class constructor initialization list

本文关键字:初始化 第一个 数组 对象 列表 构造函数      更新时间:2023-10-16

如果我有声明类 B 并实例化它的数组的类 A。

class A{
    class B{
        int x, y;
    };
    B arrB[10];
 public:
    A();
};

然后,我的问题是我想使用初始化列表初始化 A 类中"arrB"的前两个对象:

A::A(): arrB[0](1, 2), arrB[1](3, 4) {}

但是编译器不接受它。

我可以初始化数组的特定对象吗?如果是,该怎么做?

谢谢

问题是B默认将其成员隐藏为private,因为它是一个class。声明B结构,或int x, y公开为public以便能够使用聚合初始化:

class A{
    class B{
        public:
        int x, y;
    };
    B arrB[10] = {{1,2}};
 public:
    A();
};

第二个问题是您没有正确使用聚合初始化。

A::A(): arrB[0](1, 2), arrB[1](3, 4) {}

应该是

A::A(): arrB{{1, 2}, {3, 4}} {}

演示

为了初始化类成员初始化列表中的数组,您需要使用大括号,就像在函数中初始化数组一样。

因此,如果你想初始化数组的第一个和第二个元素,你至少需要使用

A() : arrB{{1,2}, {3,4}} {}

正如第一组({1,2}(所说,使arrB[0]成为B,xy分别初始化为12。第二组({3,4}(表示使arrB[1]为B,xy分别初始化为34

不过,您必须做一件事才能使这项工作完成。 您要么需要通过公开xy来进行B和聚合,也可以为B提供获取值的构造函数。 这样做可以让你拥有

class A{
    class B{
    public:
        int x, y;
    };
    B arrB[10];
 public:
    A() : arrB{{}, {3,4}} {}
};
int main() {
    A a;
}

class A{
    class B{
        int x, y;
    public:
        B() : x(), y() {} // need this so default instances are value initialized (zeroed in this case)
        B(int x, int y) : x(x), y(y) {}
    };
    B arrB[10];
 public:
    A() : arrB{{}, {3,4}} {}
};
int main() {
    A a;
}
相关文章: