2015-09-04 22 views
6

Voglio creare una classe, che ha due variabili membro intero e una funzione con due argomenti facoltativi. Se questi argomenti vengono forniti, la funzione restituisce la somma di essi; se questi argomenti non vengono forniti, la funzione restituisce la somma delle sue due variabili membro.Argomenti predefiniti come variabili membro non statiche

Ecco il codice:

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; 
    } 
}; 

Tuttavia, ottengo il seguente errore di compilazione:

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

Ciò suggerisce che le variabili membro devono essere statico di usarli come argomenti predefiniti una funzione. Ma non voglio che siano statici ...

Qual è la soluzione?

+1

Sì, devono essere statici, vedere (http://stackoverflow.com/q/ 27018251/1708801) –

risposta

6

sovraccarico Bar:

int Bar() 
{ 
    return x_ + y_; 
} 

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

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

Grazie a @ Jarod42 di questo miglioramento:

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

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

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

Il problema del mondo reale si sta cercando di risolvere è più probabilità di trarre beneficio da questo refactoring del problema originale di sommare due numeri. Questo comportamento è più chiaramente identico a quello che speravi di ottenere attraverso argomenti predefiniti.

+4

Chiamerei 'Bar (int, int)' in un'altra versione per ridimensionare il codice (intendo 'int Bar() {return Bar (_x, _y);}') – Jarod42

5

Una soluzione potrebbe essere quella di sovraccaricare la funzione Bar come: [? Perché questi argomenti di default ammessi]

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

Chiamerei 'Bar (int, int) 'in un'altra versione per la fattorizzazione del codice (intendo' int Bar() {return Bar (_x, _y);} ') – Jarod42

+0

@ Jarod42 Buon punto. Penso che il tuo sia un modo più elegante per esprimerlo. – Logicrat