簡體   English   中英

在類構造函數初始化列表中初始化對象數組的第一個條目

[英]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 publicpublic ,以便能夠使用聚合初始化:

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, xy分別初始化為12 第二組( {3,4} )表示make 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM