Aide sur une erreur de Const sur les getters et setters
Bonjour à tous ;
vos idées seront les bienvenues , actuellement je travaille sur un jeu d'échec pour simplifier : je crée 3 classes (Case - Pièce et Pion) le plateau après juste un vector sur case . mais mon objectif c'est de pouvoir déplacer un pion (marqué P à l'affichage) d'une case vers un autre . voici le code en question :
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
|
#include<iostream>
#include<string>
using namespace std;
class Case {
private:
int x ; //ligne
int y ; //colonne
char etiq ; // etiquette pour savoir si c'est un pion P ou vide '_'
public:
// getters et setters
int getX(){return x;}
int getY(){return y;}
void setX(int a){x = a;}
void setY(int b){y=b;}
void setEtiq(char C){etiq = C;}
char getEtiq(){return etiq;}
// constructeur
Case();
Case(const Case& C); // constructeur par recopie je ne sais pas si la déclaration est bonne
Case(int lig,int col,char& etiqette);
~Case();
void Afficher();
ostream& operator <<(const Case& B); // surcharge de l'operateur << afin d'afficher une case
};
// deinition des méthodes Case
Case::Case():x(0),y(0),etiq('_'){}
Case::Case(const Case& D){
x= D.x;
y = D.y;
etiq = D.etiq;
}
Case::Case(int lig,int col,char& etiqette):x(lig),y(col),etiq(etiqette){}
ostream& operator <<(ostream& out, Case B){
out << "ligne= "<<B.getX() <<" "<<"colonne= " << B.getY() <<" "<<"etiquette= "<<B.getEtiq()<< endl;
}
void Case::Afficher(){
cout << "renseignement sur cette case" << *this << endl ;
}
Case::~Case(){}
// Class Piece
class Piece {
private:
Case* place; // je pensais qu'une pièce pointe sur une case
public:
Piece();
~Piece();
void Deplacer(int ligne , int colonne,char C); // pour pouvoir le déplacer
void DeplacerCase(const Case& B); // délacement à partir d'une case
};
Piece::Piece(){
place = new Case();
}
Piece::~Piece(){}
void Piece::Deplacer(int ligne , int colonne , char P){
place->setX(ligne);
place->setY(colonne);
place->setEtiq(P);
}
void Piece::DeplacerCase(const Case& C1){
int ligne1;
ligne1 = C1.getX();
int colonne1 = C1.getY();
char eti = place->getEtiq();
place->setX(ligne1); // on change ligne piece
place->setY(colonne1); // on change colonne piece
C1.setEtiq(eti); // on change l'étiquette de la case
}
// classe Pion : un pion est une pièce
class Pion:public Piece {
private:
string couleur;
char eti ;
public:
Pion(string noir);
~Pion();
void setCouleur(string N){couleur = N;}
};
Pion::Pion(string noir){
Piece();// on fait appel au constructeur de base
couleur = "noir";
eti = 'p';
}
Pion::~Pion(){}
// more pointers
#include <iostream>
using namespace std;
int main ()
{
Case P1;
Pion P2("noir");
P1.Afficher();
return 0;
} |
Apprendre.cpp: In function `std::ostream& operator<<(std::ostream&, Case)':
Apprendre.cpp:40: warning: control reaches end of non-void function
Apprendre.cpp: In member function `void Piece::DeplacerCase(const Case&)':
Apprendre.cpp:77: error: passing `const Case' as `this' argument of `int Case::getX()' discards qualifiers
Apprendre.cpp:78: error: passing `const Case' as `this' argument of `int Case::getY()' discards qualifiers
Apprendre.cpp:83: error: passing `const Case' as `this' argument of `void Case::setEtiq(char)' discards qualifiers
Compilation échouée.
Compilation échouée.
[/CODE]
la première erreur sur non-void function pourrait passer pour le compilateur mais , mon problème c'est sur les codes en gras notamment sur les getters et setters
quand je fais
Code:
1 2 3 4
|
int ligne1;
ligne1 = C1.getX();
int colonne1 = C1.getY(); |
en quoi cela constitue une erreur ??:aie:
merci d'avance
par contre si je change la méthode comme suit :
Code:
1 2
|
void Piece::DeplacerCase( Case& C1){ |
çà me laisse penser , quelle est la signification et la différence entre ces lignes de codes :
Code:
1 2 3 4 5 6
|
(Case C1) // c'est comme une passage par valeur j'imagine
(Case& C1)
(const Case& C1)
(const Case& C1) const :arf: |
je pensais que le fait d'écrire :( const Case& C1) avec const devant , pour dire qu'on accepte que les objets de type Case:arf: