mehrere Definitionen Fehler in c++ und Lösung um dieses Problem zu lösen
Ich bin neu in C++. Ich habe einige Zweifel in Bezug auf mehrere Definitionen Fehler in C++.
Sagen wir, ich habe 3 Dateien in einem Programm. Eine header-Datei und 2 .cpp-Dateien. Ich habe die header-Datei, in der sowohl die .cpp-Dateien.
- Ich habe erklärt, eine Klasse in der header-Datei und ich habe die Klasse in jedem der .cpp Dateien in genau der gleichen Weise. So wird diese Art der Umsetzung dazu führen, dass mehrere Definitionen Fehler? Wenn ja, ist es, weil es hat zwei Kopien der Klasse-Definitionen und der compiler nicht weiß, welche man nehmen während der Verknüpfung der beiden .o Dateien?
Können wir lösen dieses problem, indem extern
in der header-Datei und die Definition der Klasse in der nur eine der beiden Dateien?Wenn wir das lösen können das Problem mit dieser Methode,haben wir zu gehören die .cpp(mit Klassendefinition) in andere .cpp Datei(mit keine Klassen-definition)?
- Habe ich deklariert und definiert eine Klasse in einer header-Datei. Ist in diesem Fall das gleiche wie oben (erwähnt in 1)?
- Ich habe erklärt, eine Klasse in der header-Datei und ich habe die Klasse in jedem der .cpp-Dateien, aber die Definitionen (Funktionskörper)unterscheidet. So wird diese Form der Umsetzung führt zu mehreren Definitionen Fehler? Wenn ja, wie können wir dieses problem lösen, in denen die Funktionen Körper unterscheidet sich in der .cpp-Dateien?
InformationsquelleAutor starkk92 | 2013-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) lösen Sie dies durch die 'Definition der Klasse' nur in einer cpp-Datei. Warum würden Sie wollen, definieren Sie es in zwei Dateien?
2) nicht definieren, Dinge in header-Dateien, nur erklären Sie Sie. Es gibt Ausnahmen von dieser Regel, zum Beispiel inline-Funktionen. Auch Klassen selbst kann mehr als einmal definiert werden (damit meine ich, er erklärt die Methoden und Datenelemente der Klasse, (d.h. schreiben
class XYZ { ... };
), aber jede definition muss identisch sein. Der einfachste Weg dies zu erreichen ist die Definition einer Klasse einmal in einer header-Datei. Dann jede definition, die aus, einschließlich header-Datei in mehreren Orten zwangsläufig identisch sein.3) Dieser ist noch dümmer, es ist eine Sache zu definieren somethiing zweimal, aber definieren Sie es zweimal, und jedesmal anders macht noch weniger Sinn.
Ich denke, die Frage ist, warum Sie denken, es könnte manchmal notwendig sein, zu definieren, Dinge mehr als einmal. Tun Sie das nicht.
Sollten Sie auch machen es klar, was du meinst, von 'definieren Sie die Klasse'. Ich habe genommen, um zu bedeuten, definieren die Methoden und statische members der Klasse. Aber wenn Sie haben etwas anderes im Sinn, vielleicht eine Quelle der Verwirrung. Wie immer ist der beste Weg, um zu vermeiden, diese Art von Terminologie Verwirrung ist post-code.
Ich bin mir nicht sicher, was der OP bedeutet, dass durch die 'Definition der Klasse'. Wie ich schon in meiner Antwort bin ich davon ausgegangen, er meinte die Definition der Methoden der Klasse.
Nach der Lektüre es eine extra Zeit, ich glaube, er meinte eigentlich die definition der Klasse. Ob er weiß den Unterschied zwischen dieser, und auch die Definition der member-Funktionen kann ich nicht sagen. Aber deine Antwort sagt deutlich (in ziemlich harschen Worten), dass man nicht definieren einer Klasse in eine header-Datei, was falsch ist.
harte Worte, ich frustriert, und eines der Dinge, das macht mich frustriert, ist die Abneigung der Menschen zu post code, wenn Sie Fragen zu Ihrem code.
Ich verstehe, was du meinst. Und ich Stimme zu, diese Frage ist etwas zu unscharf. Was ich meine, obwohl, war, dass wenn jemand Lesen würde Ihre Antwort nach kurzem suchen über die Frage, die man klar feststellen, dass die Klassen sollten nicht definiert werden in header-Dateien. Ist dies nicht der Fall, so schlage ich vor, versucht zu formulieren, die es etwas?
InformationsquelleAutor john
Beantworten alle diese Fragen, müssen Sie nur Blick auf den Zweck der Deklarationen und Definitionen.
Deklarationen einer Klasse einfach sagen, dass die Klasse vorhanden ist und in welchem Kontext. Für eine Klasse, eine einfache vorwärts-Deklaration (z.B.
class Banana;
) ermöglicht die Verwendung von Zeigern oder Referenzen auf diese Klasse, aber das ist es.Definitionen, die genau besagen, was die Klasse ist. Das heißt, die Mitglieder es hat und von welcher Basis-Klassen Sie abgeleitet ist. Sie müssen diese verfügbar, wenn Sie den Zugriff auf Mitglieder der Klasse, oder müssen wissen, die Größe der Instanzen. Dies bedeutet, dass die Klasse definition muss in einer header-Datei, so dass es aufgenommen werden kann, wo in allen Dateien, die die Klasse verwenden. Das ist OK, weil die Norm sagt, dass eine Klasse definiert werden können, die in mehreren übersetzungseinheiten, solange alle Definitionen identisch sind.
Definition einer Klasse in der Regel wie folgt aussieht:
Bitte beachten Sie jedoch, dass diese Klasse definition, die nur bedeutet, dass die definition der Klasse selbst, nicht die nicht-inline-Elementfunktionen. Wie
void eat()
im obigen Beispiel. Diese müssen definiert werden .cpp-Datei, denn Sie kann nicht definiert werden, in mehrere übersetzungseinheiten.Also kurz:
InformationsquelleAutor Agentlien
1) Sie können nicht haben zwei Definitionen der gleichen Klasse in Ihrem Projekt. Und ich habe keine Ahnung, wie Sie planen, es zu benutzen. Wenn Sie möchten, um Instanzen einer Klasse mit verschiedenen Verhaltensweisen, verwenden virtuelle Funktion wie:
2) kann Man Klasse in eine header-Datei (java-style), aber es ist nicht die beste Idee, weil der compiler wird verbrauchen mehr Ressourcen, um zu bauen andere Dateien, sind diese header. Lassen compiler schnell arbeiten - Klassen definieren .cpp-Dateien.
3) Siehe S. 1
InformationsquelleAutor Vadim Prozorov
Es gibt kein problem mit der Definition einer Klasse in mehreren Orten. Das ist genau das, was passiert, wenn man die definition in einem header-und
#include
diesen header in mehr als einer Quell-Datei. Beachten Sie jedoch, dass die Festlegung einer Klasse schreiben Sie heraus, was die Klasse enthält, die nicht der Festlegung seiner Mitglieder. Dies ist eine Klasse definition:wie die meisten Dinge, kann man nicht definieren, es mehr als einmal in einem einzigen Quellcode-Datei. Es kann jedoch angezeigt, in wie vielen Dateien, wie Sie möchten, vorausgesetzt nur, dass es überall das gleiche.
Diese Klassendefinition deklariert zwei Mitglieder, die muss irgendwo definiert sein, in der Regel wie diese:
Diese Definitionen erscheinen kann nur einmal im gesamten Programm; in der Regel jeweils einmal definiert in einer Quellcode-Datei.
InformationsquelleAutor Pete Becker