2012-04-12 11 views
2

Ich lese Effective C++ (Scott Meyers), und immer die Fehlermeldung "kein Spiel für Operator *", wenn folgenden Code aus diesem Buch zu kompilieren versuchen:kein Spiel für Betreiber *

rational.h

class rational 
{ 
    private: 
     int num; 
     int den; 
    public: 
     rational(int n = 0, int d = 1); 
     int getNum() const {return num;} 
     int getDen() const {return den;} 
}; 

rational.cpp

#include "rational.h" 

rational::rational(int n, 
        int d) 
    :num(n), 
    den(d) 
{} 

const rational operator*(const rational &lhs, 
         const rational &rhs) 
{ 
    return rational(lhs.getNum()*rhs.getNum(), 
         lhs.getDen()*rhs.getDen()); 
} 

main.cpp

#include "rational.h" 
int main() 
{ 
    rational r1(1,2); 
    rational r2; 
    r2 = 2*r1; 
    r2 = r1*3; 
    return 0; 
} 

Kann jemand erklären, warum das passiert?

+1

Müssen Sie den Operator '' in der .h-Datei deklarieren? Funktioniert es, wenn Sie alle Klassen und den Code in main.cpp inline einreihen? – Rup

+0

ja, es kompiliert in-line in main.cpp. Aber warum ? –

+0

@Tony_M: In Bezug darauf, wie Sie nicht über Deklarationen und Definitionen wissen, implementieren Sie doch Operatoren, Konstanz und alles: Ist das überhaupt Ihr eigener Code?/oops, Sie beziehen sich auf Scott Meyers. Ich denke, du solltest zuerst ein einführendes Buch bekommen, nicht eines, das deine grundlegenden Fähigkeiten manifestiert und durchsetzt. –

Antwort

3

Sie haben die operator* nicht in Ihrer Header-Datei deklariert, daher ist sie in main.cpp nicht sichtbar.

5

Sie haben vergessen, die Benutzer über die Existenz des Betreibers zu sagen:

rational.h

... 
const rational operator*(const rational &lhs, 
         const rational &rhs); 
... 

Allgemeinen in C als auch in C++, wir reden über "Definitionen" und "Erklärung". Deklarationen sind Anmerkungen, um etwas für jemand anderen sichtbar zu machen, aber an sich tun sie nichts. Definitionen die entititiess sind, die tatsächlich etwas tun:

int foo();    // <- we call it "declaration" 
int foo() { return 0; } // <- we call it foo's "definition" 

In Ihrem Code gibt es keine Erklärung von operator* sichtbar in main.cpp, so dass Sie eine irgendwo zur Verfügung stellen müssen (im Idealfall in der rationalen Header).

Als Stilberatung: In fast allen Fällen, wenn ein Konstruktor eingebauten Typen nimmt, wollen Sie es explizit machen:

explicit rational (int, int); 

Diese manchmal geringfügige Fehler verhindert, weil sie (in Ihrem Fall) rational s sein könnte unbeabsichtigt erstellt (siehe Automatic Conversions).

+0

+1 für mich das "explizite" Schlüsselwort http://StackOverflow.com/Questions/121162/what-does-the-Explicit-Keyword-in-c-mean – Sogger

+2

@Sogger: sehr vorsichtig sein, googeln für die "Explizites" Schlüsselwort :( –

+0

@MooingDuck Ha Ha ha! Deshalb war der Link, den ich gepostet habe, hier bei SO. Google Bildsuche: 'Explicit' = Kernel Panic! Error: 0x8000NSFW – Sogger