Warum kann ich eine Klasse nicht mehrfach deklarieren?

7

Ich kann das tun

%Vor%

Aber ich kann nicht dasselbe mit einer Klasse machen

%Vor%

In beiden Fällen wird kein Speicher zugewiesen.

    
deeJ 04.02.2010, 08:45
quelle

9 Antworten

25

Das Folgende sind Deklarationen :

%Vor%

Und die nächsten beiden sind Definitionen :

%Vor%

Die Regeln lauten:

  • Eine Definition ist auch eine Deklaration.
  • Sie müssen eine Deklaration eines Artikels gesehen haben, bevor Sie sie verwenden können.
  • Rückmeldung ist OK (muss identisch sein).
  • Neudefinition ist ein Fehler (die eine Definitionsregel).
Henk Holterman 04.02.2010, 08:50
quelle
3

Der kürzeste Gegenwert zu extern int i mit einer Klasse ist eine Vorwärtsdeklaration, die Sie beliebig oft ausführen können:

%Vor%

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.

    
philsquared 04.02.2010 08:50
quelle
2

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.

    
Thirler 04.02.2010 08:49
quelle
1

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):

%Vor%

Der Text macht Ihre class zu einer Definition und nicht nur zu einer Deklaration. Sie können eine Klasse einmal definieren.

    
Charles Bailey 04.02.2010 08:52
quelle
1

Sie können

tun %Vor%

so oft wie Sie möchten und dann in einer Datei mit

definieren %Vor%

Beispiel dafür:
classB.h:

%Vor%

classA.h:

%Vor%     
dbemerlin 04.02.2010 08:51
quelle
0

Aber im ersten Fall gibt es keinen Widerspruch.

%Vor%

funktioniert auch nicht. Also, wenn Sie Klasse A zu Zeiten erstellen, wäre es nicht möglich zu entscheiden, wer A ist.

    
Totonga 04.02.2010 08:50
quelle
0

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).

    
HulkHolden 04.02.2010 08:58
quelle
0

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.

%Vor%

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.

    
jalf 05.02.2010 17:25
quelle
0

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.

    
deeJ 19.02.2010 05:03
quelle

Tags und Links