2016-08-19 2 views
0

Итак, вот моя проблема: я пытаюсь изучить некоторый код, и я просто играю с изменением и изучаю некоторые новые способы его написания, но я понял, что если объявление с {} это не последняя переменная, в которой она не работает, (если я изменяю места m_belowScene и m_overscene, это работает tho).Правильный порядок инициализации переменных в конструкторе

Моя модификация:

SceneManager::SceneManager() 
    : m_scene(std::make_shared<PolyGraphicNode>()), 
     m_cplSign(std::make_shared<CPLSymbol>(0.05, 0.2, 0.5)), 
     m_belowScene(std::make_shared<PolyGraphicNode>()){ 
     std::shared_ptr<CPLSymbol> symbol = std::make_shared<CPLSymbol>(0.01, 0.04, 0.1, CPL_NODE); 
     m_belowScene->append(symbol); 
     } 
     m_overScene(std::make_shared<PolyGraphicNode>()); 

правильный способ это

SceneManager::SceneManager() 
: m_scene(std::make_shared<PolyGraphicNode>()), 
    m_cplSign(std::make_shared<CPLSymbol>(0.05, 0.2, 0.5)), 

    m_overScene(std::make_shared<PolyGraphicNode>()), 
    m_belowScene(std::make_shared<PolyGraphicNode>()){ 
    std::shared_ptr<CPLSymbol> symbol = std::make_shared<CPLSymbol>(0.01, 0.04, 0.1, CPL_NODE); 
    m_belowScene->append(symbol); 
    } 
+3

инициализатора заканчивается там, где начинается тело конструктора. Вы не можете их смешать – user463035818

+3

Порядок объявления, а не (!) Порядок в списке инициализаторов –

ответ

4

Вы должны различать между списком инициализатора и тела конструктора. Как указывал tobi303, их нельзя смешивать.

Синтаксис для написания конструктора является

Class::Class(<parameters>) : <initializer list> { <body> } 

В <body> начинается с '{'.

В списке инициализации, переменные присваиваются значения в виде variable(value)

Рассмотрим класс

class foo { 
    int x; 
    int y; 
    int z; 

    foo(int value_x, int value_y); 
}; 

Конструктор может быть определен следующим образом:

foo::foo(int value_x, int value_y) : 
    x(value_x), 
    y(value_y), 
    z(1) 
{ 
} 

Если вы хотите, чтобы добавьте другую переменную v и инициализируйте ее с некоторым значением, вы должны поместить ее в список инициализаторов, как это (обратите внимание на brac e):

foo::foo(int value_x, int value_y) : 
    x(value_x), 
    y(value_y), 
    z(1), 
    v(42) 
{ 
} 

Внутри кузова могут использоваться более сложные операции. Таким образом, ваш пример показывает присваивание операторов формы variable = value. Однако утверждения присваивания допускаются только в теле, а не в списке инициализаторов. Аналогичным образом, инициализация формы variable(value): не разрешено в теле.

Таким образом, вы должны следить за тем, какую форму вы используете в этом месте.

Смотрите также следующий вопрос о различии между этими формами переменных инициализаций: список

Смежные вопросы