2011-07-28 84 views
3

我試圖做類似如下:C++中函數聲明中成員變量的引用?

class FOO { 
void bar(int& var = m_var) { 
    // .... 
} 
int m_var; 
}; 

爲什麼沒有這個編譯?他們爲什麼不把它編入語言?有什麼辦法模仿這種行爲嗎?

+0

可能重複http://stackoverflow.com/questions/4539406/nonstatic-member-as- a-default-argument-of-nonstatic-member-function) – Nawaz

回答

6

這是不允許的,因爲m_var是一個成員變量,需要通過該對象進行訪問。如果m_var是該類的靜態成員,

簡單的解決方法是調用具有相同的名稱或通過bar()另一個的成員函數(這是一個成員函數&訪問m_var)一個重載函數並傳遞m_var通過reference.It一個參數將要相同的效果實現。

+0

@AIs - 這很容易混淆,因爲你可以從函數內部訪問m_var。例如void bar(int&var){cout << m_var; }。看起來像這是允許的,因爲bar是一個非靜態成員函數,只能使用FOO的對象調用。同樣的推理也適用於上述定義,對嗎?那麼,編譯器爲什麼會抱怨直接訪問非靜態成員。 – cppcoder

+0

@srikrish:當你訪問一個成員變量時,在非靜態成員函數內部說'membervar',它實際上是在執行'this-> membervar'。這將作爲隱式參數傳遞給每個成員函數。 –

+0

@AIs - 爲什麼編譯器不能在函數參數中訪問m_bar。使用FOO的對象調用了一個條,所以這個指針是可用的。正如Alexandre指出的那樣,它看起來像一個編譯器限制。雖然,我在想這種用法的目的是什麼? – cppcoder

4

我同意,這是語言的限制。它可以在沒有困難的情況下實施到編譯器(我的愚見)。

如果你想這種行爲,你必須寫:

class FOO 
{ 
    void bar(int& var) { ... } 
    void bar() { this->bar(m_var); } 

    int m_var; 
}; 

和額外的函數調用會被任何半體面的編譯器內聯,如果你擔心。

0

一種解決方案是具有靜態變量,這將作爲佔位符:

class FOO 
    { 
    private: 
     static int _ph_m_var; 
     void bar(int& var = _ph_var) 
     { 
       if(&var == &_ph_var) { // Default } 
     } 
}; 
0

申報m_var是一個靜態常量。它會編譯並運行。

靜態const int的m_var應該做的伎倆

[非靜態成員作爲非靜態成員函數的默認參數(的