Ich bin verwirrt darüber, wie Implementierungs- und Deklarationscode einer einfachen Klasse in eine neue Header- und CPP-Datei getrennt werden kann. Wie würde ich beispielsweise den Code für die folgende Klasse trennen?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
public:
Mitgliedern an der Spitze könnte einen Einfluss auf Menge , wenn der Benutzer bewegt sie diesen Rat nach - aber hatte Abhängigkeiten zwischen den Mitgliedern der Bestellung und war noch nicht bewusst , dass die Mitglieder in der Reihenfolge ihrer Deklaration ;-) initialisiert werdenAntworten:
Die Klassendeklaration geht in die Header-Datei. Es ist wichtig, dass Sie die
#ifndef
Include-Schutzvorrichtungen hinzufügen. Wenn Sie sich auf einer MS-Plattform befinden, können Sie diese auch verwenden#pragma once
. Außerdem habe ich das private weggelassen, standardmäßig sind C ++ - Klassenmitglieder privat.und die Implementierung geht in die CPP-Datei:
quelle
#ifndef
Zeug in der Kopfzeile?Im Allgemeinen enthält Ihre .h die Klassendefinition, die alle Ihre Daten und alle Ihre Methodendeklarationen enthält. So in Ihrem Fall:
Und dann enthält Ihre .cpp die Implementierungen der folgenden Methoden:
quelle
Es ist wichtig, die Leser, die über diese Frage stolpern, darauf hinzuweisen, dass das Verfahren der akzeptierten Antwort nicht erforderlich ist, wenn Sie Ihr Projekt nur in Dateien aufteilen möchten. Es wird nur benötigt, wenn Sie mehrere Implementierungen einzelner Klassen benötigen. Wenn Ihre Implementierung pro Klasse eine ist, reicht nur eine Header-Datei für jede aus.
Aus dem Beispiel der akzeptierten Antwort wird daher nur dieser Teil benötigt:
Die Präprozessordefinitionen #ifndef usw. ermöglichen die mehrfache Verwendung.
PS. Das Thema wird klarer, sobald Sie feststellen, dass C / C ++ 'dumm' ist und #include nur eine Möglichkeit ist, "diesen Text an dieser Stelle ausgeben" zu sagen.
quelle
.cpp
, oder ist dies nur.h
wirklich "gut" für diese Methode der Code-Organisation?Grundsätzlich eine modifizierte Syntax der Funktionsdeklaration / -definitionen:
a2dd.h
a2dd.cpp
quelle
A2DD.h
A2DD.cpp
Die Idee ist, alle Funktionssignaturen und Mitglieder in der Header-Datei zu behalten.
Auf diese Weise können andere Projektdateien sehen, wie die Klasse aussieht, ohne die Implementierung kennen zu müssen.
Außerdem können Sie anstelle des Headers andere Header-Dateien in die Implementierung aufnehmen. Dies ist wichtig, da alle in Ihrer Header-Datei enthaltenen Header in jeder anderen Datei, die Ihre Header-Datei enthält, enthalten (geerbt) werden.
quelle
Sie belassen die Deklarationen in der Header-Datei:
Und fügen Sie die Definitionen in die Implementierungsdatei ein.
Sie können die beiden mischen (lassen Sie die
getSum()
Definition beispielsweise in der Kopfzeile). Dies ist nützlich, da der Compiler beispielsweise eine bessere Chance zum Inlining hat. Dies bedeutet jedoch auch, dass das Ändern der Implementierung (falls im Header belassen) eine Neuerstellung aller anderen Dateien auslösen kann, die den Header enthalten.Beachten Sie, dass Sie für Vorlagen alles in den Kopfzeilen behalten müssen.
quelle
Normalerweise fügen Sie nur Deklarationen und wirklich kurze Inline-Funktionen in die Header-Datei ein:
Zum Beispiel:
quelle
Ich werde nicht zu sehr auf Ihr Beispiel verweisen, da es für eine allgemeine Antwort recht einfach ist (zum Beispiel enthält es keine Vorlagenfunktionen, die Sie zwingen, sie in der Kopfzeile zu implementieren). Als Faustregel befolge ich den Pickel Idiom
Es hat einige Vorteile, da Sie schnellere Kompilierungszeiten und den syntaktischen Zucker erhalten:
class->member
anstattclass.member
Der einzige Nachteil ist der zusätzliche Zeiger, den Sie bezahlen.
quelle