Инициализировать первые записи массива объектов в списке инициализации конструктора класса - PullRequest
1 голос
/ 11 июля 2019

Если у меня есть класс A, который объявляет класс B и создает его массив.

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

 public:
    A();
};

Тогда моя проблема в том, что я хотел бы инициализировать первые два объекта "arrB" в классе A, используя список инициализации:

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

Но компилятор не принимает его.

Можно ли инициализировать определенные объекты массива или нет? Если да, то как это сделать?

Спасибо

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Проблема в том, что 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}} {}

Демо

1 голос
/ 11 июля 2019

Чтобы инициализировать массив в списке инициализации члена класса, вам нужно использовать фигурные скобки, как если бы вы инициализировали массив в функции.

Таким образом, если вы хотите инициализировать первый и второйэлемент массива, который вам нужно будет использовать как минимум

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

, так как первый набор ({1,2}) говорит, что make arrB[0] a B с x и y, инициализированными 1 и2 соответственно.Второй набор ({3,4}) говорит, что make arrB[1] a B с 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;
}

или

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...