2016-04-29 16 views
-2

このコードのコメントで私の問題を説明しました。コンパイラはrootが初期化されていないと言っていますが、コンストラクタの角かっこで初期化しています。私もinitialization listを使用していた場合は、を2回の代わりに初期化しますか?どのようにこれを正しく設計するのですか?クラスのメンバーの初期化

Tree.h

class Tree 
{ 
public: 
    Tree(); 
    ~Tree(); 

private: 
    struct Node 
    { 
     Node(int i); 
     int i; 
    }; 

    Node root; 
}; 

Tree.cpp

#include "Tree.h" 

Tree::Tree() // <---- Complains that root isn't initialized 
/* An initialization list here fixes the problem, however 
* that wouldn't be convinient because I need to calculate the arguments of 
* the Node first... So if I used both an initializer list here 
* and then I also initialize the root AGAIN in the brackets bellow, 
* wouldn't I be executing more code for no reason ? 
*/ 
{ 
    root = Node(1); // initialize root 
} 

Tree::~Tree() 
{ } 

Tree::Node::Node(int i) : 
{ 
    i = 1; 
} 
+0

あなたの知識が改善されるまで、私は、ネストされたクラスや構造体を使用しないことをお勧めします。ネストされたクラスと構造は、学習の際に今のところ必要ではないレベルの複雑さを追加します。 –

+0

@ThomasMatthewsしかし、この問題では 'Node'がネストされているかどうかは関係ありません。ちょうどそれをテストした。 – dimitris93

答えて

7

あなたNodeは、デフォルトコンストラクタを持っていないので、あなたは、コンテナの初期化子リストで適切なNodeコンストラクタを呼び出す必要がありますクラスコンストラクタです。

問題を解決するには、ノードの計算をノードコンストラクタ自体にオフロードし、入力データをNodeコンストラクタに渡すことです(ノードの計算をいくつか行う必要があります)。別の方法は、Treeの関数を作成して計算を実行し、関数をイニシャライザリストで呼び出すことです。

Tree::Tree(int arg) : Node(calc_node_arg(arg)) {} 
+0

あなたが言うことから、よりよい解決策はデフォルトのNodeコンストラクタを代わりに追加することだと思いますか?これを行うための標準的なC++規約は何ですか? Nodeクラスで一度だけ修正するのはなぜですか? – dimitris93

+0

@Shiro、あなたのクラスのためのデフォルトのコンストラクタを持っているかどうか分かっているだけです。基本的に、それは事実にかかっています - 何も入力せずにオブジェクトを構築するのは意味がありますか、そうしたオブジェクトは役に立たないでしょうか?後者の場合、デフォルトコンストラクタは必要ありません。 – SergeyA

+0

コンパイラの問題は何ですか?初期化リストやコンストラクタの中で 'root 'を初期化すると、なぜ違いがありますか? – dimitris93

2

メンバ初期化リストを使用:ここ

が第二のアプローチの一例である

Tree.cppを

#include "Tree.h" 

Tree::Tree() : root(1) { 
} 

は、そうでない場合、コンパイラ生成されたコードは、構築物をデフォルトにしよう実際には不可能なrootです。

+0

私の質問を読んだら、私はそれを認識しています。そして問題は、その例の目的のために「1」があるということです。私はこの '1'を最初に計算しなければならないと言います。 – dimitris93

2

あなたはなぜこれを行うための関数を定義していない、初期化のためのiを計算する必要がある場合:

例えば

class Tree { 
    // As before 

    static int DoCalc() { 
    int i = 0; 
    // some maths to calculate i; 
    return i; 
}; 

その後

Tree::Tree() : root(DoCalc()) { } 
+0

[OK]を、代わりに ''ルート(DoCalc())の、私はより良いアプローチはSergeyAの答えを追跡し、代わりにそこに計算を行い、 'Node'コンストラクタを作成することだと思います。ですから、代わりに 'root(args)'のようなものがあります。 – dimitris93

関連する問題