2011-01-13 60 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更改爲指針。而像C杆分配:: foo1或C杆:: 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 

請指教。

非常感謝。

+0

這個例子究竟是不是工作? – 2011-01-13 05:49:43

+1

我注意到你的`CBar :: CBar()`構造函數沒有設置`m_barval`。這是故意的嗎? – chrisaycock 2011-01-13 06:01:10

回答

8

問題是由這兩條線來:

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

這是不是做你預期他們做的事情。也就是說,這些語句不會初始化類CBar中的foo1和foo2靜態成員,而是它們將名稱爲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) {} 

現在你的代碼應該工作! :-)

相關問題