初始化类构造函数初始化列表中的对象数组的第一个条目
Initialize first entries of an array of objects in class constructor initialization list
如果我有声明类 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,x
和y
分别初始化为1
和2
。第二组({3,4}
(表示使arrB[1]
为B,x
和y
分别初始化为3
和4
。
不过,您必须做一件事才能使这项工作完成。 您要么需要通过公开x
和y
来进行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;
}
相关文章:
- 构造函数在退出函数时无法初始化一个参数
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- 如何使用构造函数初始化另一个类的对象
- 初始化另一个类中的类的对象
- 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是类的构造函数C++
- 我可以初始化另一个类中的类吗?
- 数组初始化需要一个包含大括号的初始值设定项列表lambda
- 当用于初始化另一个对象时,为什么要按值传递参数
- (复制构造函数)作为参数传递给初始化另一个对象的对象如何访问私有成员
- POD结构体的值初始化是一个constexpr
- 保存一个对象的变量,然后可以用这些变量初始化另一个对象
- 初始化另一个变量或反复使用原始变量