LNK2019 Usando clases sin plantilla
Pregunta
Recibo errores de creación de enlaces cuando uso clases que hacen referencia a otras clases en ellas.
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall MovePattern::~MovePattern(void)" (??1MovePattern@@QAE@XZ) referenced in function "public: __thiscall Enemy::Enemy(int,int,class MovePattern,char)" (??0Enemy@@QAE@HHVMovePattern@@D@Z)
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall MovePattern::MovePattern(void)" (??0MovePattern@@QAE@XZ) referenced in function "public: __thiscall Enemy::Enemy(int,int,class MovePattern,char)" (??0Enemy@@QAE@HHVMovePattern@@D@Z)
Es de hacer referencia a esta clase:
class MovePattern{
public:
char next;
MovePattern();
MovePattern(const MovePattern &old){
p = old.p;
pi = 0;
next = p[0];
n = p[0];
}
MovePattern(char *pattern){
p = pattern;
pi = 0;
next = p[0];
n = p[0];
}
~MovePattern();
En esta clase:
class Enemy{
public:
Enemy(int a, int b, MovePattern p,char c)
x = b;
y = a;
MovePattern pattern (p);
symbol = c;
Actualmente están dentro del mismo archivo .cpp y MovePattern está por encima de Enemy.
No estoy seguro de lo que está pasando aquí
Visual C ++ 2010 Express con un proyecto de consola en blanco, y aún no he encontrado nada similar a mi problema, se agradecería cualquier ayuda.
Solución
No ha definido el constructor y el destructor predeterminados, como se indica a continuación:
MovePattern(); //default constructor
~MovePattern(); //destructor
Tienes que definirlos SI los declaras.La declaración debe tener una definición.De lo contrario, obtendrá un error del vinculador cuando los use , ya sea implícita o explícitamente.
Otros consejos
Este error del vinculador se debe a que no ha compilado / vinculado el archivo / código que contiene las definiciones predeterminadas de constructor (MovePattern::MovePattern()
) y destructor (MovePattern::~MovePattern()
).
Deberías declararlos inline
dentro del class MovePattern
(si realmente no haces mucho en él):
class MovePattern {
public:
MovePattern () {}
~MovePattern () {}
};
O defínalos en un archivo .cpp separado y compile / vincule ese archivo con su fuente:
// MovePattern.cpp
MovePattern::MovePattern ()
{
//...
}
MovePattern::~MovePattern ()
{
//...
}
Simplemente elimine estas dos declaraciones:
MovePattern();
~MovePattern();
Obviamente, no los necesita, ya que definió todo en un solo archivo cpp.