Может ли член класса быть инициализирован другим членом класса в списке инициализаторов? - PullRequest
0 голосов
/ 29 января 2019

Предположим, у меня есть класс с двумя членами,

class App
{
public:
   App() : window(1366, 768, "Title"), drawer(window) {}
private:
   Window window;
   Drawer drawer;
}

и класс Drawer имеет конструктор Drawer(const Window&).
Допустимо ли инициализировать элемент класса App Drawer с другим элементом класса Window,как в этом примере?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Нестатические члены данных инициализируются в порядке объявления в определении класса.Таким образом, в данном конкретном случае это работает так, как window объявлено до drawer в определении App.Но если вы измените порядок, это не будет работать так, как задумано.

Но компилятор предупредит вас об этом с соответствующим уровнем предупреждения.GCC 8.2 с опцией -Wall выдает следующие предупреждения, если порядок обратный.

#1 with x86-64 gcc 8.2
<source>: In constructor 'App::App()':

<source>:16:14: warning: 'App::window' will be initialized after [-Wreorder]
       Window window;
              ^~~~~~

<source>:15:14: warning:   'Drawer App::drawer' [-Wreorder]
       Drawer drawer;
              ^~~~~~

<source>:13:4: warning:   when initialized here [-Wreorder]
    App() : window(1366, 768), drawer(window) {}
    ^~~

Поскольку drawer инициализируется первым, он не будет инициализирован с объектом window, который был создан сзначения 1366 и 768.

0 голосов
/ 29 января 2019

Да, действует следующее:

class App
{
public:
   App() : window(1366, 768, "Title"), drawer(window) {}
private:
   Window window;
   Drawer drawer;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...