2010-09-06 12 views
11

Ésta es mi cabecera:incluyen typedef dentro de una cabecera de la clase

#ifndef TIMING_H 
#define TIMING_H 

#define MAX_MESSAGES 1000 
typedef Message* MessageP; //inside the class? 

class Timing { 

public: 

Timing(); 

private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

MessageP* _msgArr; 
int _waitingMsgs; 


}; 

Mi pregunta es: ¿Por qué tengo que colocar el typedef dentro del bloque de clase justo encima MessageP * _msgArr o ¿Está bien lo coloque cerca de todo el #define?

No genera errores de compilación, así que no estoy seguro.

Respuesta

13

fuera de la clase, ese tipo debe ser contemplado como Timing::Message, por lo

typedef Timing::Message* MessageP; 

Pero esto sólo es posible después de la declaración de Timing::Message, sin embargo MessageP se utiliza antes de la declaración de Timing se ha completado, por lo que es imposible.

Además, la estructura es un miembro private:, por lo que no puede definir esto fuera de todos modos. El typedef debe hacerse dentro de la clase Timing.

class Timing { 

public: 

Timing(); 

private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

typedef Message* MessageP; // <-- 


MessageP* _msgArr; 
int _waitingMsgs; 


}; 

no recibió error de compilación, probablemente debido a que otro tipo Message en el ámbito global ya existe.

+2

Se podría usar una declaración directa para que no tenga que estar dentro de la clase. – bobbymcr

+1

@Bobby: como no depende de 'Timing ', podría anularse y definirse antes que él. No hay forma de reenviarlo: declararlo en un alcance global sin anidar. – Potatoswatter

+0

Oh, me perdí esa parte ... así que sí, estoy de acuerdo contigo. – bobbymcr

4

Ponga el typedef en un lugar donde tenga sentido.

Ponerlo en la parte superior significaría que se inyecta el alias en el ámbito del espacio de nombres global. Ponerlo dentro de la clase puede significar que es visible en el mundo o solo visible para los miembros (y/o subclases de los mismos) dependiendo del especificador de acceso más cercano (o private si no hay ninguno).

Si los clientes de la clase no necesitan saber acerca de este alias, márquelo como privado.

Si lo coloca dentro de la clase: tenga en cuenta que, fuera de la clase, tendrá que calificar completamente el nombre como Timing::MessageP o, de lo contrario, necesitará una directiva using Timing::MessageP en alcance. Además, la calificación completa solo se puede hacer una vez que se haya definido la clase (no se pueden crear alias para los tipos incompletos; por lo tanto, la declaración progresiva Timing no funcionará).

class Timing { 
    public: 
    Timing() {} 
    private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

MessageP* _msgArr; 
int _waitingMsgs; 

}; 

typedef Timing::Message* MessageP; // okay 
1

Está bien que salga en la parte superior. Sin embargo, no es una buena práctica ponerlo en alcance global como los otros mencionados.

Cuestiones relacionadas