16 Stimmen

Warum kann man ein Objekt einer Klasse nicht innerhalb der gleichen Klasse deklarieren?

class A
{
  A a;//why can't we do this
};

24voto

GManNickG Punkte 476445

Denn die Klasse würde unendlich groß sein.

(Dies geschieht sprachlich, indem man festlegt, dass man keine unvollständigen Typen als Mitglieder haben kann, sondern nur Verweise oder Zeiger auf sie, und dass A ist bis zum Ende der Klassendefinition ein unvollständiger Typ).

23voto

Foo Bah Punkte 24553

Das können Sie tun

class A {
    A* a;
}

weil dafür die Größe von A nicht bekannt sein muss.

12voto

EboMike Punkte 74805

Ich nehme an, du kommst aus Java oder so? A a erzeugt eine vollständige Instanz des Typs A die, nun ja, Folgendes enthält A die Folgendes enthält A die Folgendes enthält A .

Sie denken wahrscheinlich darüber nach:

class A
{
  A *a; // A pointer to A, not a full instance
};

8voto

Nawaz Punkte 339767
A a;//why can't we do this

Denn A ist ein unvollständiger Typ, da er noch nicht definiert wurde, sondern noch definiert wird. Und der Compiler muss den vollständigen Typ von A wenn er es im Inneren sieht class A und da A unvollständig ist, ist es kann nicht seine Größe zu bestimmen, ist es kann nicht bestimmen, wie viel Platz die Mitgliedsvariable a nehmen wird, daher wird es nicht kompiliert.

Da aber die Größe eines Zeigers dem Compiler bekannt ist, spielt es keine Rolle, um welche Art von Zeiger es sich handelt. Sie können einen Zeiger in Ihrer Klasse wie folgt definieren:

class A
{
    A *pA; //okay since sizeof(pA) == sizeof(void*) == well-known to the compiler!
};

Online-Demo : http://www.ideone.com/oS5Ir

3voto

DesignIsLife Punkte 500

In C++ : Sie können dies nicht tun, da es sich um eine rekursive Struktur handelt (kein Ende für die Berechnung der Objektgröße), um dieses Problem zu überwinden,
Verwenden Sie selbstreferenzielle Zeiger, d.h. Zeiger mit der Adresse des gleichen Klassentyps.

class A
{
    A* aObj; // Self Referential Pointer
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X