• Domingo 19 de Mayo de 2024, 04:12

Autor Tema:  error LNK2001  (Leído 1781 veces)

duquesito

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
error LNK2001
« en: Jueves 8 de Abril de 2010, 16:46 »
0
Hola a todos,

He leído en un foro un problema que se podría parecer al mismo que tengo yo (id del otro hilo: 39309. está en c++ builder), pero no consigo arreglarlo con la misma solución.

Tengo un proyecto de VS2008. Originalmente, éste simula el comportamiento de un aire acondicionado, poniendo el valor de sus variables miembros (temperatura y humedad) en su constructor.

Aquí está el código original (o por lo menos lo más destacado para el asunto):

Simulation.h:

Código: C++
  1. class Simulation {
  2.     ...
  3.     /*
  4.     métodos virtuales puros
  5.     virtual bool getEstado(...);
  6.     virtual bool getDato(...);
  7.     virtual bool setDato(...);
  8.     */
  9.  
  10. protected:
  11.     bool estado;
  12.     double temperatura;
  13. };
  14.  
  15. class AireAcondicionadoSimulation: public Simulation {
  16.     /*
  17.     AireAcondicionadoSimulation();
  18.     bool getEstado(...);
  19.     bool getDato(...);
  20.     bool setDato(...);
  21.     */
  22.  
  23. protected:
  24.     double humedad;
  25. };
  26.  
  27. class CalderaSimulation: public Simulation {
  28.     ...
  29. };
  30.  

simulation.cpp:

Código: C++
  1. #include "simulation.h"
  2.  
  3. ...
  4.  
  5. AireAcondicionadoSimulation::AireAcondicionadoSimulation()
  6. {
  7.     estado = true;
  8.     temperatura = 23;
  9.     humedad = 50;
  10. }
  11.  
  12. ...
  13.  

 

Lo que me gustaría hacer es un método estático en la clase Simulation donde cambie el valor de la temperatura (por ejemplo) con un valor pasado por teclado.
Lo primero que he hecho ha sido coger el valor por teclado y guardarlo en una variable en el main. A continuación, he creado el método estático en la clase AireAcondicionadoSimulation y, para finalizar, he cambiado en la clase Simulation la declaración de la variable miembro "temperatura" para hacerla estática.

Me explico:
 

simulation.h

Código: C++
  1. class Simulation {
  2.     ...
  3.     /*
  4.     Métodos virtuales públicos
  5.     virtual bool getEstado(...);
  6.     virtual bool getDato(...);
  7.     virtual bool setDato(...);
  8.     */
  9.  
  10. protected:
  11.     bool estado;
  12.     [b]static double temperatura;[/b]
  13.  
  14. };
  15.  
  16. class AireAcondicionadoSimulation: public Simulation {
  17.     /*
  18.     AireAcondicionadoSimulation();
  19.     bool getEstado(...);
  20.     bool getDato(...);
  21.     bool setDato(...);
  22.     */
  23.     [b]static bool cambiarT(double t);[/b]
  24.  
  25. protected:
  26.     double humedad;
  27. };
  28.  
  29. class CalderaSimulation: public Simulation {
  30.     ...
  31. };
  32.  

 

simulation.cpp

Código: C++
  1. #include "simulation.h"
  2.  
  3. ...
  4.  
  5. bool AireAcondicionadoSimulation::cambiarT(double t) {
  6.     temperatura = t;
  7.     return true;
  8. }
  9.  
  10. AireAcondicionadoSimulation::AireAcondicionadoSimulation()
  11. {
  12.     estado = true;
  13.     temperatura = 23;
  14.     humidedad = 50;
  15. }
  16.  
  17. ...
  18.  

 
No pasa nada si la temperatuda al principio se pone a 23, pero me gustaría ir cambiándola durante la ejecución del programa mediante el teclado.

Lo que obtuve con todo ese código fueron los siguientes dos errores:

    * "error LNK2001: unresolved external symbol protected: static double Simulation::temperatura (? temperatura@Simulation@@1NA)" en el archivo "simulation.obj".
    * "fatal error LNK1120: 1 unresolved externals" en el archivo ejecutable

 

¿Qué es lo que estoy haciendo mal? ¿Podríais ayudarme o guiarme para poder solucionarlo? No hago más que dar vueltas y no consigo la solución.

Gracias a todos de antemano por vuestra ayuda


Saludos

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: error LNK2001
« Respuesta #1 en: Jueves 8 de Abril de 2010, 19:24 »
0
El mensaje "unresolved external symbol protected" que significa en español "simbolo externo de tipo protected sin resolver" quiere decir que el linker no puede encontrar la variable o metodo en tu codigo ni en ninguna libreria externa.

Lo mas probable es que hayas borrado o escrito mal la variable Simulation::temperatura.

Verifica que no la hayas borrado o escrito mal (mayuscula por minuscula, una letra en lugar de otra, que te hayas comido una letra o escrito una letra de mas) la variable temperatura

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

duquesito

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: error LNK2001
« Respuesta #2 en: Viernes 9 de Abril de 2010, 08:26 »
0
Muchas gracias. Al final he conseguido saber qué era lo que estaba mal. Faltaba una declaración de la variable estática justo antes del main.
Por ejemplo:
double AireAcondicionadoSimulation::temperatura = 78;

De nuevo, muchas gracias por todo


Un saludo