2015-09-04 12 views
6

Ich möchte eine Klasse erstellen, die zwei ganzzahlige Membervariablen und eine Funktion mit zwei optionalen Argumenten hat. Wenn diese Argumente angegeben werden, gibt die Funktion die Summe dieser Argumente zurück. Wenn diese Argumente nicht angegeben werden, gibt die Funktion die Summe ihrer zwei Mitgliedsvariablen zurück. HierStandardargumente als nicht statische Membervariablen

ist der Code:

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

Allerdings bekomme ich folgende Kompilierungsfehler:

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

Dies deutet darauf hin, dass die Mitgliedsvariablen zu statisch sein müssen, sie zu benutzen in als Standardargumente in eine Funktion. Aber ich will nicht, dass sie statisch sind ...

Was ist die Lösung?

+1

Ja, sie haben statisch zu sein, siehe (http://stackoverflow.com/q/ 27018251/1708801) –

Antwort

6

Überlastung Bar:

int Bar() 
{ 
    return x_ + y_; 
} 

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

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

Dank @ Jarod42 für diese Verbesserung:

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

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

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

Das reale Problem, das Sie lösen möchten, ist eher von diesem Refactoring profitieren als die ursprüngliches Problem der Summierung von zwei Zahlen. Dieses Verhalten ist offensichtlich identischer als das, was Sie durch Standardargumente erreichen wollten.

+4

Ich würde 'Bar (int, int) 'in einer anderen Version aufrufen, um den Code zu faktorisieren (ich meine' int Bar() {return Bar (_x, _y);} ') – Jarod42

5

würde Eine Abhilfe Ihre Bar Funktion zu überlasten, wie: [? Warum diese Standardargumente dürfen]

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

würde ich' Bar (int, int) 'in anderer Version, um den Code zu faktorisieren (ich meine' int Bar() {return Bar (_x, _y);} ') – Jarod42

+0

@ Jarod42 Guter Punkt. Ich denke, deine ist eine elegantere Art, es auszudrücken. – Logicrat

Verwandte Themen