2011-02-09 17 views
7
class A 
{ 
    A a;//why can't we do this 
}; 
+1

Co stanie się, gdy zostanie utworzona taka klasa? Budowałby A, który konstruuje kolejne A, i tak dalej, aż do końca czasu. Tak, tak, konstruktor, który sprawia, że ​​przepełnienie stosu nie jest dobrą rzeczą. Och, tak, a instancja miałaby nieskończony rozmiar. –

+13

To żółwie do samego końca. – jason

Odpowiedz

15

Można zrobić

class A { 
    A* a; 
} 

ponieważ nie wymaga znajomości wielkości A.

6
A a;//why can't we do this 

Ponieważ A jest niekompletny typu, ponieważ nie została jeszcze określona, ​​a to jest zdefiniowane. I kompilator musi znać pełną typ A gdy widzi go wewnątrz class A, a od A jest niekompletna, to nie może określić jego rozmiar, to nie może określić ile miejsca zmienna członkiem a zamierza podjąć w związku z tym to go nie skompiluje.

Ale ponieważ rozmiar wskaźnika jest dobrze znany kompilatorowi, bez względu na to, jaki typ wskaźnika jest. Można zdefiniować wskaźnik w swojej klasie tak:

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

Demo online: http://www.ideone.com/oS5Ir

16

Ponieważ klasa byłaby nieskończona wielkości.

(Odbywa się to język mądry, określając nie można mieć niepełnych typów jako członkowie, tylko odwołać lub wskaźniki do nich, i że A jest niekompletny typ do końca definicji klasy).

+12

A co jeśli ma on nieskończony rozmiar? W dzisiejszych czasach pamięć jest tania! –

+2

@ James: Przypomina mi faceta, który chciał napisać program, który tworzy każde możliwe słowo składające się z 23 liter i nie wzdrygnął się, gdy powiedziałem mu, że do tego potrzeba ponad miliona dysków TB ... – EboMike

9

Rozumiem, że pochodzisz z Javy lub coś takiego? A a utworzy pełną instancję typu A, która, dobrze, zawiera A, która zawiera A, która zawiera A.

Pewnie myślisz o tym:

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

W C++: Ty nie może tego zrobić, ponieważ będzie to struktura rekursywna (bez końca dla obliczania wielkości obiektu), Aby pokonać ten problem,
Użyj własnego Referenta ial Wskaźnik, np. wskaźnik o adresie typu tej samej klasy.

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

W ten sposób można mieć wskaźnik do obiektu klasy A i w ten sposób nie jest wymagane, aby poznać rozmiar klasy A zanim zostanie ogłoszony w czasie kompilacji.

class A { 
A* a; 
}; 
-1
Class Date 
    { 
    int d,m,y; 
    static Date default_date; 
    }; 

Ten przykład podano w "Bjarne Stroustrup C++ Programming Language - 3rd Edition".

I działa ... Niektóre wyjaśnienia byłyby miłe.

Powiązane problemy