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?
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?
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ę:
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
};
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. –
@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). –
Dlaczego miałbym to zrobić, gdybym mógł po prostu dołączyć plik nagłówka, który deklaruje "MyOtherClass"? – Andreas
Wow! Nie widziałem takiej składni, interesującej, +1 –
@KirilKirov: ale widziałaś 'struct tm *', prawda? –
@ MatthieuM. - absolutnie. Myślałem dokładnie tak samo, pisząc ten komentarz :) –