我試圖做類似如下:C++中函數聲明中成員變量的引用?
class FOO {
void bar(int& var = m_var) {
// ....
}
int m_var;
};
爲什麼沒有這個編譯?他們爲什麼不把它編入語言?有什麼辦法模仿這種行爲嗎?
我試圖做類似如下:C++中函數聲明中成員變量的引用?
class FOO {
void bar(int& var = m_var) {
// ....
}
int m_var;
};
爲什麼沒有這個編譯?他們爲什麼不把它編入語言?有什麼辦法模仿這種行爲嗎?
這是不允許的,因爲m_var
是一個成員變量,需要通過該對象進行訪問。如果m_var
是該類的靜態成員,
簡單的解決方法是調用具有相同的名稱或通過bar()
另一個的成員函數(這是一個成員函數&訪問m_var
)一個重載函數並傳遞m_var
通過reference.It一個參數將要相同的效果實現。
@AIs - 這很容易混淆,因爲你可以從函數內部訪問m_var。例如void bar(int&var){cout << m_var; }。看起來像這是允許的,因爲bar是一個非靜態成員函數,只能使用FOO的對象調用。同樣的推理也適用於上述定義,對嗎?那麼,編譯器爲什麼會抱怨直接訪問非靜態成員。 – cppcoder
@srikrish:當你訪問一個成員變量時,在非靜態成員函數內部說'membervar',它實際上是在執行'this-> membervar'。這將作爲隱式參數傳遞給每個成員函數。 –
@AIs - 爲什麼編譯器不能在函數參數中訪問m_bar。使用FOO的對象調用了一個條,所以這個指針是可用的。正如Alexandre指出的那樣,它看起來像一個編譯器限制。雖然,我在想這種用法的目的是什麼? – cppcoder
我同意,這是語言的限制。它可以在沒有困難的情況下實施到編譯器(我的愚見)。
如果你想這種行爲,你必須寫:
class FOO
{
void bar(int& var) { ... }
void bar() { this->bar(m_var); }
int m_var;
};
和額外的函數調用會被任何半體面的編譯器內聯,如果你擔心。
一種解決方案是具有靜態變量,這將作爲佔位符:
class FOO
{
private:
static int _ph_m_var;
void bar(int& var = _ph_var)
{
if(&var == &_ph_var) { // Default }
}
};
申報m_var是一個靜態常量。它會編譯並運行。
靜態const int的m_var應該做的伎倆
[非靜態成員作爲非靜態成員函數的默認參數(的
可能重複http://stackoverflow.com/questions/4539406/nonstatic-member-as- a-default-argument-of-nonstatic-member-function) – Nawaz