C++ 初始化类构造函数初始化列表中对象数组的第一个条目
如果我有声明类B并实例化其数组的类AC++ 初始化类构造函数初始化列表中对象数组的第一个条目,c++,constructor,initializer,C++,Constructor,Initializer,如果我有声明类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 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
,因为它是类
。声明B
a结构,或将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}
)所说,makearrB[0]
ab分别初始化为x
和y
,分别初始化为1
和2
。第二组({3,4}
)表示makearrB[1]
ab,其中x
和y
分别初始化为3
和4
但你必须做一件事才能让这一切顺利进行。您需要将B
设置为公共,并通过将x
和y
设置为公共进行聚合,或者您可以为B
提供一个构造函数,该构造函数接受值。这样做可以让你
class A{
class B{
public:
int x, y;
};
B arrB[10];
public:
A() : arrB{{}, {3,4}} {}
};
int main() {
A a;
}
或
您需要在初始化列表中而不是只在构造函数函数体中使用此选项吗?可能类似于:
arrB{1,2}、{3,4}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{code>或arrB{1,2}、{3,4}}
之类的内容,但是其余元素都会获得随机值,并且必须是结构或公共x,y@KIIV:第二种形式很好;其余的元素将被零初始化编译器在第二种形式上抱怨,因为它给出了关于数组项的其余部分的init的错误询问在有问题的编辑之后它将不起作用。它将使用struct{intx,y;}代码>
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;
}