[英]Initialize first entries of an array of objects in class constructor initialization list
如果我有A類聲明B類並實例化它的數組。
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
為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}
)表示make arrB[0]
是一個B, x
和y
分別初始化為1
和2
。 第二組( {3,4}
)表示make 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.