2010-05-14 15 views
15

Por lo tanto, me encontré con una firma de método interesante que no entiendo muy bien, se fue a lo largo de las líneas de:C++, la clase como parámetro a un método, no template

void Initialize(std::vector<std::string> & param1, class SomeClassName * p); 

lo que no lo hago entiendo que la palabra clave "class" se usa como parámetro, ¿por qué está ahí? ¿Es necesario especificar o es puramente superficial?

+0

vi esto así en un miembro de la clase declaración y me estaba volviendo loco tratando de descubrir lo que significaba. 'clase Foo { privado: clase Bar * pointerToBar; } ' – Vicro

Respuesta

16

Es una declaración avanzada de la clase. Es efectivamente el mismo que

class SomeClassName; 
void Initialize(std::vector<std::string> & param1, SomeClassName * p); 

Hay muchas situaciones en las que una declaración directa es útil; hay una lista completa de cosas que puede y no puede hacer con una declaración directa en this answer to another question).

+0

¿actúa como declaración directa entonces? – ra170

+0

@ ra170: Sí, lo hace. –

+1

"pero necesita usar un puntero o referencia a una instancia de la clase" -> Si solo tiene una declaración de función sin definición como en este caso, puede ir bien con parámetros de valor. –

1

No es superficial. Le permite especificar "SomeClassName" como parámetro incluso si "SomeClassName" aún no se ha definido.

+0

¿actúa como declaración directa entonces? – ra170

1

Más superficial. En C, cuando se define una estructura:

struct x { 
    int member; 
    char member2; 
}; 

Para utilizar eso, usted tiene que utilizar struct x whatever. Si desea utilizar x como un nombre por sí mismo (sin el struct que le precede) usted tiene que utilizar un typedef:

typedef struct x { 
    int member; 
    char member2; 
} x; 

En C++, sin embargo, la primera (sin el typedef) tiene más o menos el mismo efecto que el segundo (ambos definen x para que pueda usarlo por sí mismo, sin que struct lo preceda). En C++, un class es esencialmente lo mismo que un struct, excepto que por defecto es private en lugar de public (para miembros y herencia).

El único lugar donde existe una diferencia es si no hay una definición de class en el alcance en el punto de la declaración de la función.

0

es el mismo que usted escribe:

for(int i=0;i<10;i++) 

como

int i; 
for(i=0;i<10;i++) 

la declaración de clase es una definición y un puntero a ella

+0

el alcance de la variable i es diferente. – iOS

+0

No responde la pregunta original. – prapin

Cuestiones relacionadas