[VC++] Problème avec un héritage
j'ai un problème assez étrange avec VC++.
j'ai une classe "Piece"
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
| class piece
{
public:
piece();
piece(bool);
piece(int,char);
piece(int,char,bool);
~piece();
bool GetCouleur();
int GetPostionL();
char GetPostionC();
void SetCouleur(bool);
void SetPostionL(int L, char C);
void VerifDep(int,char);
void Affichage();
protected:
bool Couleur;
int PositionL;
char PositionC;
}; |
et 2 classes dérivée
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class tour:public piece
{
public:
tour();
tour(bool);
tour(int,char);
tour(int,char,bool);
void VerifDep(int,char);
};
class fou:public piece
{
public:
fou();
fou(bool);
fou(int,char);
fou(int,char,bool);
void VerifDep(int,char);
}; |
Dans mon main j'ai le code suivant
Code:
1 2 3 4 5 6
| tour T1(2,'B',0);
T1.Affichage();
fou F1(5,'F',1);
F1.Affichage();
char f='B';
F1.VerifDep(2,f); |
et quand j'appel VerifDep la variable PositionC de F1 passe à 0 même si je virre tous le code dans le corps de VerifDef.
voici le code sources de mon fichier piece.cpp
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
| #include <iostream.h>
#include <string.h>
#include "Piece.h"
int Abso(int);
piece::piece()
{
cout << "Creation d'une piece" << endl;
Couleur = NOIR;
PositionL = 0;
PositionC = 'I';
}
piece::piece(bool C)
{
cout << "Creation d'une piece" << endl;
Couleur = C;
PositionL = 0;
PositionC = 'I';
}
piece::piece(int l,char c)
{
cout << "Creation d'une piece" << endl;
Couleur = NOIR;
PositionL = l;
PositionC = c;
}
piece::piece(int l,char c,bool C)
{
cout << "Creation d'une piece" << endl;
Couleur = C;
PositionL = l;
PositionC = c;
}
piece::~piece()
{
}
void piece::Affichage()
{
cout << "Position sur la colone : " << PositionC << " - " << "Position sur la ligne : " << PositionL << endl;
}
bool piece::GetCouleur()
{
return Couleur;
}
int piece::GetPostionL()
{
return PositionL;
}
char piece::GetPostionC()
{
return PositionC;
}
void piece::SetCouleur(bool C)
{
if (C == 0 || C == 1)
Couleur = C;
}
void piece::SetPostionL(int L, char C)
{
if (L > 0 && L < 9 && C >='A' && C <= 'H')
{
PositionL = L;
PositionC = C;
}
}
void piece::VerifDep(int l, char c)
{
int i=0;
}
tour::tour()
{
cout << "Creation d'une tour" << endl;
}
tour::tour(bool C):piece(C)
{
cout << "Creation d'une tour" << endl;
}
tour::tour(int l,char c):piece(l,c)
{
cout << "Creation d'une tour" << endl;
}
tour::tour(int l,char c,bool C):piece(l,c,C)
{
cout << "Creation d'une tour" << endl;
}
void tour::VerifDep(int l, char c)
{
/*if (PositionC >= 'A' && PositionC <= 'H' && PositionL > 0 && PositionL <= 8 && l>0 && l<=8 && c >= 'A' && c <= 'H')
{
if (PositionC == c && PositionL != l)
return true;
if (PositionC =! c && PositionL == l)
return true;
}*/
int i=0;
}
fou::fou()
{
cout << "Creation d'un fou" << endl;
}
fou::fou(bool C):piece(C)
{
cout << "Creation d'un fou" << endl;
}
fou::fou(int l,char c):piece(l,c)
{
cout << "Creation d'un fou" << endl;
}
fou::fou(int l,char c,bool C):piece(l,c,C)
{
cout << "Creation d'un fou" << endl;
}
void fou::VerifDep(int l, char c)
{
/*if (PositionC >= 'A' && PositionC <= 'H' && PositionL > 0 && PositionL <= 8
&& l>0 && l<=8 && c >= 'A' && c <= 'H')
{
if (PositionC != c && PositionL != l && Abso(PositionC-c) == Abso(PositionL-l) && PositionC != c && PositionL != l)
return true;
}
return false;*/
}
int Abso(int i)
{
if (i > 0)
return i;
else
return -i;
} |
Quelqu'un à une idée d'où viens le problème.
Re: [VC++] Problème avec un héritage
salut ,
voici quelque correction que je ferais:
1.
Citation:
Envoyé par Freakazoid
Code:
1 2 3
| #include <iostream.h>
#include <string.h>
#include "Piece.h" |
à remplacer par:
Code:
1 2 3
| #include <iostream>
#include <string>
#include "Piece.h" |
2. initialiser comme ça dans les constructeur:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
piece::piece(): Couleur(Noir), PositionL(0), PositionC('i')
{
cout << "Creation d'une piece" << endl;
}
piece::piece(bool C): Couleur(C), PositionL(0), PositionC('i')
{
cout << "Creation d'une piece" << endl;
}
piece::piece(int l,char c): Couleur(NOIR), PositionL(l), PositionC(c)
{
cout << "Creation d'une piece" << endl;
}
piece::piece(int l,char c,bool C): Couleur(C), PositionL(l), PositionC(c)
{
cout << "Creation d'une piece" << endl;
} |
ou mieu:
Code:
1 2 3 4 5 6 7 8 9
|
//dans le *.h:
piece(int l = 0, c = 'I', bool C = NOIR );
...
//dans le *.cc
piece::piece(int l,char c,bool C): Couleur(C), PositionL(l), PositionC(c)
{
cout << "Creation d'une piece" << endl;
} |
et tu n'as plus besoin que de se constructeur. ( à faire la meme chose dans les classe tour et fou)
3. mettre le destructeur en virtual dans tes clase (piece, tour et fou)
Code:
1 2 3
|
// dans le *.h
virtual ~piece(); |
4.
Citation:
Code:
1 2 3 4 5 6
|
void piece::SetCouleur(bool C)
{
if (C == 0 || C == 1)
Couleur = C;
} |
a remplacer par
Code:
1 2 3 4 5 6 7 8 9 10
|
// dans le *.h
bool SetCouler(bool C);
...
//dans le *.cc
bool piece::SetCouleur(bool C)
{
Couleur = C;
} |
le test est inutile, un bool est soit true soit false.
5.
Citation:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
void fou::VerifDep(int l, char c)
{
/*if (PositionC >= 'A' && PositionC <= 'H' && PositionL > 0 && PositionL <= 8
&& l>0 && l<=8 && c >= 'A' && c <= 'H')
{
if (PositionC != c && PositionL != l && Abso(PositionC-c) == Abso(PositionL-l) && PositionC != c && PositionL != l)
return true;
}
return false;*/
} |
est faut, si tu fais un return , ton type de retour ne doit par etre void,
je suppose que ta fonction doit retourner un bool donc
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
// dans le *.h dans
bool VerifDep(int l, char c);
...
// dans le *.cc
bool fou::VerifDep(int l, char c)
{
if (PositionC >= 'A' && PositionC <= 'H' &&
PositionL > 0 && PositionL <= 8
&& l>0 && l<=8 && c >= 'A' && c <= 'H')
{
if (PositionC != c && PositionL != l && Abso(PositionC-c) == Abso(PositionL-l) &&
PositionC != c && PositionL != l)
return true;
}
return false;
} |
6.
Citation:
Code:
1 2 3 4 5
|
void piece::Affichage()
{
cout << "Position sur la colone : " << PositionC << " - " << "Position sur la ligne : " << PositionL << endl;
} |
à remplacer par
Code:
1 2 3 4 5
|
void piece::Affichage()
{
cout << "Position sur la colone : " << PositionC << " - Position sur la ligne : " << PositionL << endl;
} |
bon, je m'arrete là, il y a encore des truc a revoir, comme l'utilisation d'int pour la position de te piece, une unsigned char serait plus approprié.
en esperant que ça te soit utilie.
Ciao!!