2016-08-19 11 views
0

これは私の問題です。私はいくつかのコードを学習しようとしていて、ちょうどそれを書き換えるためのいくつかの新しい方法を探求しながら遊んでいますが、最後の変数ではありません(もし私がm_belowSceneとm_oversceneの場所を変更すると、それはうまく動作します)。コンストラクタ内の変数の初期化の適切な順序

マイ修正:

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>開始です。あなたがしたい場合は

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

:初期化子リストで

は、変数がvariable(value)

は、コンストラクタは次のように定義されるかもしれないクラス

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

    foo(int value_x, int value_y); 
}; 

考えてみましょう形で値が割り当てられます別の変数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)という形式の初期化は、ではなく、が本体に許可されています。

したがって、どのフォームをどの場所で使用するか注意しなければなりません。

は、変数の初期化のこれらのフォームの違いにも、次の質問を参照してください:コンストラクタの本体が始まる

関連する問題