2015-09-04 73 views
6

我想要創建一個類,它有兩個整型成員變量和一個具有兩個可選參數的函數。如果提供了這些參數,函數返回它們的總和;如果未提供這些參數,則該函數將返回其兩個成員變量的和。默認參數作爲非靜態成員變量

下面是代碼:

class Foo 
{ 
private: 
    int x_; 
    int y_; 
public: 
    Foo(int x, int y) : x_(x), y_(y){} 
    int Bar(int a = x_, int b = y_) 
    { 
     int z = a + b; 
     return z; 
    } 
}; 

不過,我得到以下編譯錯誤:

invalid use of non-static data member 'Foo::x_' 
int x_; 
    ^
invalid use of non-static data member 'Foo::y_' 
int y_; 
    ^

這表明,成員變量必須是靜態的,在使用它們的默認參數一個函數。但我不希望它們是靜態的...

解決方案是什麼?

+1

是的,他們必須是靜態的,請參閱(http://stackoverflow.com/q/ 27018251/1708801) –

回答

6

超載Bar

int Bar() 
{ 
    return x_ + y_; 
} 

int Bar(int x) 
{ 
    return x + y_; 
} 

int Bar(int x, int y) 
{ 
    return x + y; 
} 

感謝@ Jarod42這個改進:

int Bar(int a, int b) 
{ 
    return a + b; 
} 

int Bar(int a) 
{ 
    return Bar(a, y_); 
} 

int Bar() 
{ 
    return Bar(x_, y_); 
} 

你試圖解決的現實問題是更有可能從這個重構比受益總結兩個數字的原始問題。這種行爲與您希望通過默認參數實現的行爲更加明顯相同。

+4

我會在其他版本中調用'Bar(int,int)'來分解代碼(我的意思是'int Bar(){return Bar(_x,_y);}') – Jarod42

5

一種解決方法是超載Bar函數爲:?允許這些默認參數爲什麼]

int Bar() 
{ 
    return x_ + y_; 
} 
int Bar(int a) 
{ 
    return a + y_; 
} 
int Bar(int a, int b) 
{ 
    return a + b; 
} 
+4

我會調用Bar int,int)'在其他版本中分解代碼(我的意思是'int Bar(){return Bar(_x,_y);}') – Jarod42

+0

@ Jarod42好點。我認爲你是一種更優雅的表達方式。 – Logicrat