2011-01-13 6 views
3

コードについては下記をご覧ください。そのコンパイルは正常に完了しましたが、予期した結果が機能していません。配列の初期化が有効なので、私は非常に混乱していますクラスのデータ型を持つ構造体のメンバーに値を正しく割り当てるにはどうすればよいですか?

//cbar.h 
class CBar 
{ 
public: 
    class CFoo 
    { 
    public: 
     CFoo(int v) : m_val = v {} 
     int GetVal() { return m_val; } 
    private: 
     int m_val; 
    }; 
public: 
    static const CFoo foo1; 
    static const CFoo foo2; 

public: 
    CBar(CFoo foo) m_barval(foo.GetVal()){} 
    int GetFooVal() { return m_barval; } 
private: 
    int m_barval; 
}; 

//cbar.cpp 
const CBar::CFoo foo1 = CBar::CFoo(2); 
const CBar::CFoo foo2 = CBar::CFoo(3); 

//main.cpp 
struct St 
{ 
    CBar::CFoo foo; 
}; 

St st[] = { CBar::foo1, CBar::foo2 }; 

for(int i=0; i<sizeof(st)/sizeof(St); i++) 
{ 
    CBar cbar(st[i].foo); 
    std::cout << cbar.GetFooVal() << std::endl; 
} 

しかし、その後私はSt :: fooをポインタに変更します。などCBARのアドレスを割り当てる:: foo1のかCBAR ::このようなfoo2は、その作業を、

//main.cpp 
struct St 
{ 
    const CBar::CFoo *foo; 
}; 

St st[] = { &CBar::foo1, &CBar::foo2 }; 

for(int i=0; i<sizeof(st)/sizeof(St); i++) 
{ 
    CBar cbar(*st[i].foo); 
    std::cout << cbar.GetFooVal() << std::endl; 
} 

本当の問題があります。アプリは出力する必要があります

2 
3 

アドバイスをしてください。

多くのありがとうございます。あなたがやっているし、それらを意図したとおりにやっていません

const CBar::CFoo foo1 = CBar::CFoo(2); 
const CBar::CFoo foo2 = CBar::CFoo(3); 

+0

この例では正確には何が動作していませんか? –

+1

'CBar :: CBar()'コンストラクタが 'm_barval'を設定していないことに気付きました。これは意図的ですか? – chrisaycock

+0

@chrisaycock:そのミスポポ。編集されました。ありがとう – domlao

答えて

8

問題は、これらの2つのラインから来ています。つまり、これらのステートメントはfoo1とfoo2の静的メンバーをクラスCBarから初期化するのではなく、グローバルの変数をfoo1とfoo2という名前で定義します。

あなたが記述する必要があるすべて:

const CBar::CFoo CBar::foo1 = CBar::CFoo(2); 
const CBar::CFoo CBar::foo2 = CBar::CFoo(3); 

あなたは違いが気づいたことがありますか?はい、CBarで "foo1"と "foo2"を修飾する必要があります。

しかし、私は書くことを好むだろう:

const CBar::CFoo CBar::foo1(2); 
const CBar::CFoo CBar::foo2(3); 

まったく同じです!間違っている

CFoo(int v) : m_val = v {} 


もう一つの問題は、このラインです。初期化リストに "="を使用することはできません。これを書いてください:

CFoo(int v) : m_val(v) {} 

あなたのコードは動作するはずです! :-)

+1

うわー。どうもありがとう。 – domlao

+0

@ササイインズ:あなたの問題を解決し、それが完璧だと思うなら、この答えを「受け入れられた答え」とマークしてください。 – Nawaz

+0

ああ..それをクリックして忘れて:)感謝。 – domlao

関連する問題