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

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

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

class A{
    class B{
        int x, y;
    };
    B arrB[10];

 public:
    A();
};

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

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}} {}

Demo

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

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

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

作为第一组 ({1,2}) 说使 arrB[0] 一个 B 与 xy 初始化为 12分别。第二组 ({3,4}) 表示将 arrB[1] 设为 B,其中 xy 分别初始化为 34

你必须做一件事才能完成这项工作。您要么需要制作 B 并通过制作 xy public 进行聚合,或者您可以为 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;
}