méthode virtuelle dans héritages
bonjour à tous
voila je débute en c++ et je suis actuellement en train de faire un petit jeu d'échec avec qt
j'en suis à la définition des classes et je rencontre déja un problème
j'ai une classe pièces et 7 classes pion, cavalier,... qui dérive de celle ci
toutes les données sont contenus dans pièces, les sous-classes n'ont pas de propriété spécifiques. Ce qui est spécifique aux sous-classes est la méthode déplacer(). j'ai donc déclaré dans piece la méthode deplacer() comme virtual.
J'ai aussi déclaré le destructeur comme virtual, comme indiqué sur le site (ou un autre je sais plus.
avant de vous montrer le code je vous montre tous les warnings et erreurs que ca me provoque:
Code:
1 2 3 4 5 6 7 8
|
//warning
undefined reference to `tour::~tour()'
undefined reference to `tour::~tour()'
undefined reference to `vtable for pieces'
//des undefined comme ca y en a 80
//1 erreur
:-1: error: collect2: ld returned 1 exit status |
maintenant le code de la sur classe
pieces.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#ifndef PIECE_H
#define PIECE_H
#include "cases.h"
#include <QString>
#include <QIcon>
class pieces
{
public:
pieces(int j, int w, int z);
int getnomjoueur();
virtual QString deplacer(cases *c);
QIcon geticone();
void seticon(QIcon ic);
int getx();
int gety();
virtual ~pieces();
protected:
QIcon icone;
int nomJoueur;
int x;
int y;
};
#endif // PIECE_H |
pieces.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
#include "pieces.h"
//l'icone n'est pas renseigné dans le constructeur car il résulte d'un test dasn la sous-clase
//cette icone n'est donc pas connu lors de l'appel au constructeur de pièces
pieces::pieces(int j,int w, int z)
{
nomJoueur = j;
x=w;
y=z;
}
QIcon pieces::geticone(){return icone;}
int pieces::getnomjoueur() {return nomJoueur;}
int pieces::getx(){return x;}
int pieces::gety(){return y;} |
et un exemple d'une sous-classe
cavalier.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#ifndef CAVALIER_H
#define CAVALIER_H
#include <QString>
#include "cases.h"
#include "pieces.h"
class cavalier:public pieces
{
public:
cavalier(int j, int w, int z);
QString deplacer(cases *c);
~cavalier();
};
#endif // CAVALIER_H |
cavalier.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
#include "cavalier.h"
cavalier::cavalier(int j,int w, int z):pieces(j,w,z)
{
QString i;
if (j==1) i="image/cavb.png";
else i="image/cavn.png";
//icone est une propriete de pieces, peut etre que je n'ai pas le droit???
icone=QIcon(i);
}
QString cavalier::deplacer(cases *c)
{
return "";
} |
voila je sais plus trop quoi faire, je suis un peu paumé dans mon héritage, j'ai un peu tout essayé, virtual pas virtual, déclarer le constructeur dans le cpp pas le déclarer,... merci d'avance pour vos réponses