Das Folgende sind Deklarationen :
%Vor%Und die nächsten beiden sind Definitionen :
%Vor%Die Regeln lauten:
Der kürzeste Gegenwert zu extern int i
mit einer Klasse ist eine Vorwärtsdeklaration, die Sie beliebig oft ausführen können:
Wenn Sie die tatsächliche Klasse definieren, sagen Sie, wie viel Speicher benötigt wird, um eine Instanz davon zu erstellen, und wie dieser Speicher ausgelegt ist. Das ist jedoch nicht wirklich das Problem hier.
Der erste (extern) bezieht sich auf eine bestehende Variable. Sie geben also nur die Variable zweimal an.
Die Klassendeklaration gibt einem Typ Bedeutung (Ihre Klasse: A). Sie versuchen, A zwei Bedeutungen zu geben. Dies ist für Sie nicht von Nutzen und kann nur verwirren, daher schützt der Compiler Sie davor.
Übrigens, wenn Sie beide Klassen in verschiedene Namespaces einfügen, können Sie ihnen denselben Namen geben.
Sie können eine Klasse und ein Objekt mehrfach deklarieren, was Sie nicht tun können, ist define mehr als einmal.
extern
macht dies zu einer Deklaration und nicht zu einer Definition (weil es keinen Initialisierer gibt):
Der Text macht Ihre class
zu einer Definition und nicht nur zu einer Deklaration. Sie können eine Klasse einmal definieren.
Ich denke, die wirkliche Frage ist: "Warum willst du das?". Die Situation tritt manchmal auf, wenn Sie eine Headerdatei mehrere Male in derselben Übersetzungseinheit (.cpp-Datei) einschließen. Wenn dies der Fall ist, sollten Sie Wächter verwenden, um den Compiler glücklich zu machen.
Ein weiterer Grund, dass dies Probleme für Sie verursachen könnte, ist, dass Sie eine Bibliothek eines Drittanbieters verwenden, die Klassen definiert, deren Namen mit Ihren eigenen Klassen in Konflikt stehen. In diesem Fall sollten Sie Namespaces verwenden, um die Mehrdeutigkeit zu beheben.
In beiden Fällen 'extern int i;' referenziert dasselbe Objekt (an anderer Stelle deklariert) und so sind die Mehrfachdeklarationen eindeutig. Wenn du geschrieben hast:
%Vor%Der Compiler würde sich über die Mehrdeutigkeit beklagen (weil er nicht wüsste, welche Variable Sie manipulieren wollten, wenn Sie 'i = 0;' geschrieben hätten.)
Doppelte Klassendeklarationen führen zu der Möglichkeit, dass sich die Deklarationen unterscheiden; wieder, wie würde der Compiler wissen, welche zu verwenden, wenn es "A foo;" Ich denke, der Compiler könnte die Klassendeklarationen vergleichen und verifizieren, dass sie tatsächlich identisch sind, aber das wäre eine Menge Aufwand, wenn die alternativen Lösungen (Namespaces, Wächter, Umbenennen) so viel einfacher sind (und wahrscheinlich auch weniger) verwirrend für wer auch immer den Code liest).
Es hat nichts mit Deklarationen im Vergleich zu Definitionen zu tun. Das Problem sind Typen im Vergleich zu Objekten.
%Vor% teilt dem Programm mit, dass ein Objekt vom Typ int
vorhanden ist und der Name i
lautet. Weil es extern
ist, wird kein Speicher für hier reserviert, aber woanders, wahrscheinlich in einer anderen Übersetzungseinheit, ist es definiert und Speicher dafür reserviert.
definiert einen -Typ mit dem Namen A
. Es weist keine Objekte oder Variablen zu. Es macht zur Laufzeit keinen Unterschied, und es wird kein Speicher dafür reserviert, weil es kein Objekt ist. Es führt einfach einen neuen -Typ in den Compiler ein. Ab diesem Zeitpunkt können Sie Objekte vom Typ A
erstellen, und sie haben Speicherplatz zugewiesen.
Ich habe darüber nachgedacht. Ich realisierte Klasse in kein Datentyp, es ist ein Enabler für die Definition eines Datentyps.
Also in
%Vor%int ist ein Datentyp. Also deklarieren wir eine Variable und nicht einen Datentyp neu.
Aber in
%Vor%A ist ein Datentyp. Und wir definieren einen Datentyp neu, was natürlich nicht erlaubt ist.
Tags und Links c++