2017-05-15 5 views
-2

Ich versuche, Code zu schreiben, der eine Klasse mit den privaten Stunden und Minuten erstellt. Jetzt versuche ich eine neue Klasse aus einer Ganzzahl minus einer anderen Klasse zu erstellen.Ganzzahl minus eine Klasse

class Foo 
{ 
Public: 
    Foo(int u, int m); 
    Foo(int m); 
    int operator-(const Foo& other); 
    friend Foo operator-(int lhs, const Foo& rhs); 

Private: 
    int minute, hour; 
}; 

Foo::Foo(int u, int m): hour(u), minute(m){} 
Foo::Foo(int m): hour(0), minute(m){} 

int Foo::operator-(const Foo& other) 
{ 
    int x; 
    x = (60*(uur-other.uur)); 
    x += (min - other.min); 
    return x; 
} 

main() 
{ 
    Foo t1(2,10); 
    const Foo kw(15); 
    Foo t2(t1 -kw); 
    Foo t3(2,10); 
    Foo t4(132 -t3); 
} 

Jetzt kann ich nicht bekommen T4 nur 2 Minuten enthalten (132 - ((60 * 2) -10)) Wer weiß, wie diese zu lösen? ich den Fehler: Fehler: keine Übereinstimmung für ‚operator-‘ (Operandentypen sind ‚int‘ und ‚Foo‘)

void operator-(int x, const Foo& other); 

Wenn ich diese Funktion enthalten erhalte ich die Fehler Fehler: ‚void foo :: operator- (int, const Foo &) 'muss entweder Null oder ein Argument nehmen. Verstanden mit dem folgenden Code arbeiten:

Foo operator-(int lhs, const Foo& rhs) 
{ 
    int y; 
    y = lhs - rhs.min; 
    y -= (60 * rhs.uur); 
    return y; 
} 
+3

Sie müssen [Überlastung] (http://stackoverflow.com/questions/4421706/operator-overloading) der 'Betreiber -' der Klasse. – NathanOliver

+0

Oder Sie könnten einen Cast-Operator definieren, um einen 'Foo' in einen' int' zu konvertieren, und einen 'Foo'-Konstruktor, der ein einzelnes' int' übernimmt. – Beta

+0

'(1,0)' vs '(0, 60)' .. das wird Spaß machen. –

Antwort

2

Da die Fehlermeldung sagt, benötigen Sie ein operator-, die ein int als sein linkes Argument und ein Foo als sein rechten Argument. Dies kann keine Member-Funktion sein, da Member-Funktionen immer ihren eigenen Typ als erstes Argument verwenden. So haben Sie es eine kostenlose Funktion zu machen:

Foo operator-(int, const Foo&) { ... } 
+0

Wenn ich einschließe: void operator- (int x, const Foo & andere); diese Funktion bekomme ich den Fehler Fehler: 'void Foo :: operator- (int, const Foo &)' muss entweder Null oder ein Argument – Dylan

+1

@Dylan Basierend auf der Fehlermeldung in Ihrer Bearbeitung scheinen Sie es ein Mitglied gemacht haben 'Foo'. Es sollte nicht sein. Wie in der obigen Antwort angegeben, muss es eine * free * -Funktion sein. –

+0

@ G.M. Dies ist nicht möglich, da Minute und Stunde privat sind. 'Foo Operator- (int x, const Foo & andere) ') { int y; y = x - andere.min; y - = (60 * anderes.uur); Rückkehr y; } ' – Dylan