vi este constructor:¿Qué significa "clase" en un constructor?
MyClass(class MyOtherClass* = 0) {}
¿Qué significa la palabra clave class
? ¿El constructor toma un puntero MyOtherClass
y predetermina el argumento al puntero nulo?
vi este constructor:¿Qué significa "clase" en un constructor?
MyClass(class MyOtherClass* = 0) {}
¿Qué significa la palabra clave class
? ¿El constructor toma un puntero MyOtherClass
y predetermina el argumento al puntero nulo?
Es una declaración directa. MyOtherClass
no tiene que definirse antes de su uso en este contexto, por lo que una declaración directa es suficiente. El =0
es el valor predeterminado para el argumento.
Braindump de los casos en los que no es necesario una definición completa:
Comparar el siguiente:
//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
};
Solo un punto aclaratorio. 'MyOtherClass' no tiene que estar completamente definido aquí porque todo lo que se necesita es un puntero a él. Un forward-declare le dice al compilador todo lo que necesita saber sobre 'MyOtherClass' para generar un puntero al mismo. –
@JohnDibling no restringido a un puntero. En este caso, funciona porque es un parámetro. Por lo que sé, solo necesita una definición completa para un miembro de objeto (los miembros del puntero, las referencias, los parámetros y los tipos de devolución no requieren una definición completa). –
¿Por qué querría hacer eso si pudiera simplemente incluir el archivo de cabecera que declara 'MyOtherClass'? – Andreas
¡Guau! No he visto tal sintaxis, interesante, +1 –
@KirilKirov: pero usted vio 'struct tm *' ¿verdad? –
@MatthieuM. - Absolutamente. Estaba pensando exactamente lo mismo, mientras escribía este comentario :) –