c++, Wie man richtig aufteilen .cpp in einem .cpp und eine .h
Ich bin wirklich neu ist die Aufteilung ein .cpp in einem .cpp und eine .h.
Ich verwendet habe .h-Dateien vor, aber wirklich nie split ein .cpp in einem .cpp und eine .h.
Weiß ich .h-Dateien sind nur für Erklärungen und .cpp sind für Definitionen, und ich versuchte, zu teilen .cpp in einem .cpp und eine .h aber ich bekomme eine Menge von Fehlern, so Frage ich mich, wenn mir jemand helfen kann mit meinem code.
Die folgende Klasse ist die Klasse, die noch NICHT aufgeteilt wurden, in eine .cpp und eine .h doch, nur um zu zeigen Sie die Jungs, die "vor-version".
TicketOrder.cpp
#include <iostream>
using namespace std;
class TicketOrder
{
private :
char type;
int quantity;
public :
friend std::ostream& operator<<(std::ostream& os, TicketOrder const& order)
{
os << " Type: " << order.type << ", Quantity: " << order.quantity;
return os;
}
//Getters
int getQuantity() const;
{
return quantity;
}
char getType() const;
{
return type;
}
//Setters
void setQuantity (int x)
{
quantity =x;
}
void setType(char y)
{
type =y;
}
};
Nun, ich Teile die oberhalb der Klasse in einem .cpp und eine .h
TicketOrder.cpp
#include <iostream>
#include "TicketOrder.h"
using namespace std;
class TicketOrder
{
//Getters
int getQuantity() const
{
return quantity;
}
char getType() const
{
return type;
}
//Setters
void setQuantity (int x)
{
quantity =x;
}
void setType(char y)
{
type =y;
}
};
TicketOrder.h
#include <iostream>
using namespace std;
class TicketOrder
{
private :
char type;
int quantity;
public :
friend std::ostream& operator<<(std::ostream& os, TicketOrder const& order)
{
os << " Type: " << order.type << ", Quantity: " << order.quantity;
return os;
}
//Getters
int getQuantity() const;
char getType() const;
//Setters
void setQuantity (int x);
void setType(char y);
};
Habe ich eine andere Klasse verwendet und enthält die main-Klasse, die werde ich nicht zählen, weil hier lange und ich finde es nicht wichtig, weil ich weiß, ich mache das .h und .cpp falsch.
Wenn ich versuche zu kompilieren die wichtigsten, es gibt mir diese Fehlermeldung:
Undefined first referenced
symbol in file
TicketOrder::getQuantity() const /var/tmp//ccaSflFG.o
TicketOrder::setType(char) /var/tmp//ccaSflFG.o
TicketOrder::setQuantity(int) /var/tmp//ccaSflFG.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
Kann mir jemand helfen mit der Spaltung der .h und die .cpp? Oder geben Sie mir Anregungen? Ich habe viel recherchiert und kann nicht herausfinden, was falsch ist.
Danke.
- 1) verwenden Sie ein minimal-Beispiel, 2) gehen Sie einfach mit Leerzeichen, 3)nicht duplizieren Sie die Erklärung der
TicketOrder
. - Doppelte Deklarationen der Klasse wäre in Ordnung (die Aussehen wie
class TicketOrder;
, aber hier haben wir eine doppelte definition. - du hast Recht, ich stehe korrigiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre .cpp-Datei ist falsch, da ist re-Deklaration der Klasse, so dass ist der und der Fehler. Es sollte etwas entlang der Linien von:
Beachten Sie auch, dass das hinzufügen einer
using namespace
in eine header-Datei, wie Sie tun, ist, als sehr schlechter Stil..h
- Datei anstelle der.cpp
(die auch die.h
).g++ -o app app.cpp TicketOrder.o
(für die GNU-compiler), so dass die Implementierungen dieser undefinierten Symbole sind verfügbar, wenn die Verknüpfung "app".non-member function 'int getQuantity()' cannot have cv-qualifier
bedeutet, dass die Funktion eine nicht-Mitglied - Funktion, aber es sollte ein member - Funktion. So haben Sie wahrscheinlich vergessen, dieTicketOrder::
vor dem Namen.Können Sie spielen mit lzz, es macht genau das automatisch. Im Standard-Modus, es wird Ihnen zeigen, mehr oder weniger, wo die Dinge in der Regel gehen.
Können Sie tun dies sehr erfolgreich, wenn Sie nur kümmern sich um diese paar Tipps
Rodrigo bereits angesprochen Ihr Hauptproblem. Lassen Sie mich nur hinzufügen einige Stil Kommentar:
using namespace std
, da Sie bereits mit der std-Mitglieder mit derstd::
Präfix. Meiner Meinung nach ist dies (fast) immer die beste Lösung, da dieusing namespace X
Richtlinie vererbt werden könnte durch einige andere Dateien, in denen das Ihre .h-Datei.using namespace std
platzieren, dass die Richtlinie innen Ihre Klasse, so dass andere Dateien, in denen das ihrige nicht. Sie könnten definieren, Funktionen/Klassen mit dem gleichen Namen, von der std, die würde zu Kompilierungs-Fehler, wenn es einusing namespace std
Richtlinie über...<iostream>
, da es bereits im header enthalten... ja,<iostream>
hat sicher ein header-guard, so ist es nicht wirklich zweimal dabei. Aber ich denke, es ist schön, nicht enthalten, was schon in der Kopfzeile... Aber vielleicht ist es nur mein Geschmack... 😉