2016-03-21 15 views
1

Ich schreibe gerade ein Programm, um Gas in einer Box zu simulieren. Aber ich bin auf ein Problem mit Klassenbetreibern gestoßen. Leider, um die Dinge nervig zu machen, heißt die Klasse Vector, ich weiß, manche werden nicht mögen, dass sie so genannt wird.Nicht-Mitgliedsfunktionsoperator + (...) kann keinen cv-Qualifier haben

Vector.h

class Vector { 
private: 

double x; 
double y; 
double z; 

public: 

Vector & operator+=(const Vector & v){ 
    x += v.x; 
    y += v.y; 
    z += v.z; 
    return *this; 
} 

ich den Code editierte haben über dieses Problem deutlicher zu machen. Ich habe den Konstruktor usw. weggelassen, da sie das Problem nicht beeinflussen.

Und für CPP

Vector.cpp

Vector operator+(const Vector v) const{ 
Vector v2(*this); 
v2+=v; 
return v2; 
} 

Und seine yeilds Fehler:

C: \ Benutzer \ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp: 95: 34: Fehler: Nichtmitglied Funktion 'Vector operator + (Vector)' nicht haben cv-Qualifier

C: \ Benutzer \ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp: In Funktion 'Vector operator + (Vector)' :

Jede Hilfe sehr geschätzt.

+0

@BarryTheHatchet Ich habe die Frage als Tippfehler gedeutet (fehlt nur der Deklarator).Angesichts der Tatsache, dass es tatsächlich eine ganz andere Funktion ist, ist das eindeutig nicht der Fall ... – Barry

Antwort

2

Der Fehler sagt Ihnen, was falsch ist. Sie haben diese Nichtmitgliedsfunktionen erstellt, aber sie sollten Mitgliedsfunktionen sein. Der Compiler hat das Problem durch Ihre (korrekte) Verwendung von const erkannt, obwohl auch die Anzahl der Argumente fehlt und das wäre ein weiterer Kompilierungsfehler, sobald der erste behoben wurde.

Entweder haben Sie vergessen, diese Funktionsdefinitionen in den Bereich class Vector { ... }; zu setzen, oder Sie haben vergessen, Vector:: vor operator zu schreiben.

+1

'operator +' ganz sicher ** sollte nicht ** eine Mitgliedsfunktion sein. Ich finde diese Antwort verwirrend. – SergeyA

+1

Warum sagst du 'operator +' sollte keine Memberfunktion sein? Das könnte ... –

+0

@SergeyA: Das ist deine Meinung. Es ist keine Tatsache. Ich bleibe bei den Facts. –

1

Nur Elementfunktionen können const Spezifizierer haben. Beide Operatoren sind Nicht-Member-Funktionen (da ihnen der Klassenname als Teil ihrer Signatur fehlt) und sind nicht innerhalb der Klassendefinition definiert.

Als Ergebnis haben Sie einen Kompilierungsfehler.

Um diesen Fehler zu beheben, müssen Sie operator+ auf eine freie Funktion übersetzen: es Erklärung von Ihrem Vector Klasse zu entfernen und es ist sigature ändern (die einfachste Form):

Vector operator+ (const Vector& lhs, const Vector& rhs); 

Es gibt bestimmte Gründe eine verwenden, andere Signatur, und akzeptieren Sie das erste Argument nach Wert, aber das ist viel zu tief für Ihr Niveau, so dass ich vorschlage, const Referenz für jetzt zu bleiben.

1

Danke für die anderen Eingaben, Beide haben einen Verdienst für sie. Ich habe meine eigene Antwort basierend auf der Antwort von Barry @BarryTheHatchet gefunden. Und andere Quellen. Um dieses Problem zu lösen ich die Definition in der Header-Datei im öffentlichen Bereich bewegte, mir geben:

Vector & operator+=(const Vector & v){ 
    x += v.x; 
    y += v.y; 
    z += v.z; 
    return *this; 
} 

Vector operator+(const Vector v) const { 
    Vector VecPlus(*this); 
    VecPlus.x += v.x; 
    VecPlus.y += v.y; 
    VecPlus.z += v.z; 
    return VecPlus; 
} 

Dies das Ergebnis war, ich hoffe, dass es eine legitime Art und Weise ist es zu codieren und kein shody Weg tue es aber würde zu späteren Problemen führen. Ich bin in meinem Projekt vorangekommen und es hat bisher noch niemanden angesprochen.

+0

In der zweiten Funktion, wenn Sie das Argument nicht-'const' machen, können Sie direkt an' v' arbeiten und es vermeiden, 'VecPlus' zu erzeugen, welches momentan eine überschüssige Kopie ist. –

Verwandte Themen