2012-10-10 17 views
5

widziałem tego konstruktora:Co oznacza "klasa" w konstruktorze?

MyClass(class MyOtherClass* = 0) {} 

Co oznacza słowo kluczowe class oznacza? Czy konstruktor przyjmuje wskaźnik MyOtherClass i domyślnie używa argumentu zerowego?

+0

Wow! Nie widziałem takiej składni, interesującej, +1 –

+1

@KirilKirov: ale widziałaś 'struct tm *', prawda? –

+0

@ MatthieuM. - absolutnie. Myślałem dokładnie tak samo, pisząc ten komentarz :) –

Odpowiedz

10

To deklaracja terminowa. MyOtherClass nie musi być zdefiniowane przed użyciem w tym kontekście, więc wystarczająca jest deklaracja przekazania. =0 jest domyślną wartością argumentu.

Braindump przypadków, w których nie trzeba pełną definicję:

  • wskaźniki członkowskie
  • referencje członków
  • typy parametrów
  • metoda
  • typy powrotu metody

Porównaj następujące:

//MyClass.h 
class MyClass 
{ 
    MyClass(MyOtherClass* = 0) {} //doesn't compile 
            //doesn't know what MyOtherClass is 
}; 

//MyClass.h 
class MyClass 
{ 
    MyClass(class MyOtherClass* = 0) {} //compiles, MyOtherClass is declared 
}; 

//MyClass.h 
class MyOtherClass; //declare MyOtherClass 
class MyClass 
{ 
    MyClass(MyOtherClass* = 0) {} //compiles, declaration available 
}; 
+1

Tylko punkt wyjaśniający. 'MyOtherClass' nie musi być tutaj w pełni zdefiniowany, ponieważ wszystko, co jest potrzebne, jest wskaźnikiem do niego. Deklaracja forward mówi kompilatorowi wszystko, co musi wiedzieć o 'MyOtherClass', aby wygenerować wskaźnik do niego. –

+0

@JohnDibling nie ogranicza się do wskaźnika. W tym przypadku działa, ponieważ jest to parametr. Potrzebna jest tylko pełna definicja elementu obiektu, o ile wiem (elementy wskaźnika, odwołania, parametry i typy zwracane nie wymagają pełnej definicji). –

+0

Dlaczego miałbym to zrobić, gdybym mógł po prostu dołączyć plik nagłówka, który deklaruje "MyOtherClass"? – Andreas