2012-10-10 95 views
5

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?

+0

¡Guau! No he visto tal sintaxis, interesante, +1 –

+1

@KirilKirov: pero usted vio 'struct tm *' ¿verdad? –

+0

@MatthieuM. - Absolutamente. Estaba pensando exactamente lo mismo, mientras escribía este comentario :) –

Respuesta

10

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:

  • punteros miembros
  • referencias miembros
  • tipos de parámetros
  • método
  • tipos de retorno método

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 
}; 
+1

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. –

+0

@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). –

+0

¿Por qué querría hacer eso si pudiera simplemente incluir el archivo de cabecera que declara 'MyOtherClass'? – Andreas

Cuestiones relacionadas