LNK2019 Usando classes não modeladas
Pergunta
Estou recebendo erros do vinculador ao usar classes que fazem referência a outras classes nelas.
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)
É uma referência a esta classe:
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();
Nesta aula:
class Enemy{
public:
Enemy(int a, int b, MovePattern p,char c)
x = b;
y = a;
MovePattern pattern (p);
symbol = c;
Eles estão atualmente no mesmo arquivo .cpp e MovePattern está acima do Inimigo.
Não tenho certeza do que está acontecendo aqui
Visual C ++ 2010 Express com um projeto de console em branco, e eu não encontrei nada semelhante ao meu problema ainda, qualquer ajuda seria apreciada.
Solução
Você não definiu o construtor padrão e o destruidor, conforme listado abaixo:
MovePattern(); //default constructor
~MovePattern(); //destructor
Você deve defini-los SE os declarar.A declaração deve ter definição.Do contrário, você obterá um erro de vinculador ao usá-los , implícita ou explicitamente.
Outras dicas
Este erro do vinculador ocorre porque você não compilou / vinculou o arquivo / código que contém as definições padrão do construtor (MovePattern::MovePattern()
) e do destruidor (MovePattern::~MovePattern()
).
Você deve declará-los inline
dentro do class MovePattern
(se você realmente não fizer muito nele):
class MovePattern {
public:
MovePattern () {}
~MovePattern () {}
};
Ou defina-os em um arquivo .cpp separado e compile / vincule esse arquivo à sua fonte:
// MovePattern.cpp
MovePattern::MovePattern ()
{
//...
}
MovePattern::~MovePattern ()
{
//...
}
Basta remover essas duas declarações:
MovePattern();
~MovePattern();
Obviamente, você não precisa deles - já que definiu tudo em um único arquivo cpp.