2011-04-02 17 views
7

Mi objetivo es una clase como:C++ definir struct miembro de la clase y devolverlo en una función miembro

class UserInformation 
{ 
public: 
    userInfo getInfo(int userId); 
private: 
    struct userInfo 
    { 
     int repu, quesCount, ansCount; 
    }; 
    userInfo infoStruct; 
    int date; 
}; 

userInfo UserInformation::getInfo(int userId) 
{ 
    infoStruct.repu = 1000; 
    return infoStruct; 
} 

pero el compilador da error que en Defintion de la función pública getInfo(int) el tipo de retorno userInfo no es un tipo nombre.

Respuesta

4

Es necesario cambiar el orden de los miembros de UserInformation y poner struct UserInfopor encima de la declaración de getInfo. El compilador se queja de que no puede encontrar la firma para getInfo porque aún no ha visto la definición de su tipo de devolución.

Además, si devuelve una estructura de la función, el tipo de estructura debe ser visible para las personas que llaman. Entonces necesita hacer la estructura public también.

4

¡Si la función de miembro es pública, entonces el tipo de devolución debe ser públicamente visible! Por lo tanto, mueva la definición de estructura interna a la sección public.

Tenga en cuenta también que debe definirse antes de la función que lo utiliza.

4

Just do UserInformation::userInfo UserInformation::getInfo(int userId).

Además, debe declarar userInfo público.

+0

¿Por qué necesitamos el calificador 'UserInfomation' para' userInfo. ¿No debería el compilador comprobar por defecto el namescope de 'UserInformation'? – anaken78

+0

@ anaken78 Lo que usted, yo o cualquier otra persona cree que un compilador compatible debe hacer es irrelevante. Esto es lo que ** hace ** hacer. La clase no está en el alcance hasta que se abre la lista de argumentos de la función, por lo que los nombres no se pueden buscar sin calificar. Estoy seguro de que el razonamiento detrás de esto, en términos de análisis y otras cosas, se ha discutido ampliamente en otro lado, si quieres buscarlo. O simplemente use un tipo de devolución final: 'autoInformación de usuario :: getInfo (int userId) -> userInfo' (por cierto, estas son algunas malas opciones de nombres). La clase y sus miembros están dentro del alcance cuando el tipo de devolución se declara en esa posición. –

12

Tiene sentido hacer público el tipo de estructura anidada, ya que el código de usuario debería ser capaz de usarlo. Además, coloque la declaración de la estructura antes del punto de su primer uso. Fuera del alcance de la clase, use la resolución de alcance :: para hacer referencia a los tipos anidados.

class UserInformation 
{ 
public: 
    struct UserInfo 
    { 
     int repu, quesCount, ansCount; 
    }; 


public: 
    UserInfo getInfo(int userId); 

private: 
    UserInfo infoStruct; 
    int date; 
}; 

UserInformation::UserInfo UserInformation::getInfo(int userId) 
{ 
    infoStruct.repu = 1000; 
    return infoStruct; 
} 
Cuestiones relacionadas