• Miércoles 1 de Mayo de 2024, 23:29

Autor Tema:  Eliminar Un Warning  (Leído 1648 veces)

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Eliminar Un Warning
« en: Lunes 1 de Diciembre de 2003, 20:02 »
0
Hola a todos.

He hecho una clase de tipo singleton y, al compilar el archivo, obtengo el siguiente warning:
Código: Text
  1. cscreen.h:26: aviso: `class Screen' solamente define constructores privados y no tiene friends
  2.  
Con Visual Studio puedo quitar los warnings con la directiva #pragma warning( disable : X ) pero, ¿cómo puedo hacerlo coon g++?

Muchas gracias

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Eliminar Un Warning
« Respuesta #1 en: Domingo 7 de Diciembre de 2003, 16:39 »
0
Algo importante es que si te salen warnings la idea es solucionar el warning..NO esconderlo...  :blink:  si no no tendria ningun sentido.

Ahora.. como recomendacion , y aunque no conozco mucho de c++ y menos del compilador g++... es mejor que definas las estructuras que te faltan, y si no las usas debe haber una foma de declaralas fuera de uso.

Otra opcion es que tu compilador este usandio un standart al que no estas habituado, para lo cual deberas verificar la documentacion de l compilador para configurarlo a que compile en styandart o por lo menos en el modo con que estes mas familiaizado. :comp:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Eliminar Un Warning
« Respuesta #2 en: Lunes 15 de Diciembre de 2003, 15:10 »
0
Hola. Gracias por responder.

El compilador lo tengo configurado para que compile según el estándar ANSI C++ con las extensiones GNU, por lo que no tiene nada raro.

Soy perfectamente consciente de que los warnings muchas veces ayudan a encontrar errores (siempre compilo con -Wall, para que muestre todos los warnings), pero en este caso concreto el que no haya ningún constructor público es debido a que no quiero que el usuario haga más instancias de la clase además de la que ya hay (como ya dije, sigue el patrón de diseño singleton, en el cual sólo hay una instancia estática privada de la propia clase y se accede a ella a través de un método estático que devuelve un handler).

Por otro lado, tras consultar toda la documentación del compilador gcc me di cuenta de que no se puede quitar un warning concreto, sino los de algún tipo, o alguno que tenga definido un parámetro concreto, o todos. No hay un código asociado a cada tipo de warning como en otros compiladores, para poder tratarlos individualmente.

Un saludo.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Eliminar Un Warning
« Respuesta #3 en: Martes 16 de Diciembre de 2003, 14:46 »
0
Publica el codigo por favor.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Eliminar Un Warning
« Respuesta #4 en: Martes 16 de Diciembre de 2003, 16:57 »
0
Esta es una versión resumida de la clase (le he quitado variables privadas y temas varios que no influyen para que aparezca el warning), que aparece en el fichero de cabecera que emite el warning.

Código: Text
  1.  
  2. class Screen
  3. {
  4.     static Screen m_Screen;
  5.     std::string m_title;
  6.     bool m_used;
  7.    
  8.     Screen(std::string title) : m_title(title), m_used(false) {};
  9.     Screen(const Screen&) {};
  10. public:
  11.     ~Screen();
  12.     int Init();
  13.     void Print(textattr_t type, const char *text, ...);
  14.     void Read(char *text, int maxsixe);
  15.     void Done();
  16.  
  17.     static Screen* Handler() {return &m_Screen;}
  18. };
  19.  
  20.  

Aunque el constructor sea privado, en el fichero .cpp sí se llama al constructor al iniciar la variable estática m_Screen:

Código: Text
  1.  
  2. Screen Screen::m_Screen("Cliente IRC");
  3.  
  4.  

Para acceder a los métodos de la clase, la única manera es escribirlo de esta forma:

Código: Text
  1.  
  2. Screen::Handler()->Print( lo que sea );
  3.  
  4.  

Con esta definición la aplicación compila y funciona perfectamente, a pesar del aviso informandome de un posible error que no es tal. Además, se protege la clase para que no se puedan crear más instancias de ella.

Un saludo.