IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Aide sur une erreur de Const sur les getters et setters


Sujet :

C++

  1. #1
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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:eplacerCase(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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int ligne1;
    ligne1 = C1.getX();
    int colonne1 = C1.getY();
    en quoi cela constitue une erreur ??
    merci d'avance

    par contre si je change la méthode comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     void Piece::DeplacerCase( Case& C1){
    çà me laisse penser , quelle est la signification et la différence entre ces lignes de codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tout d'abord, même un warning nécessite d'être compris et traité. Le compilateur ne cause pas pour ne rien dire en général. Donc :
    Apprendre.cpp: In function `std::ostream& operator<<(std::ostream&, Case)':
    Apprendre.cpp:40: warning: control reaches end of non-void function
    Que dit cet avertissement : que tu sors de la fonction (control reaches end) d'une fonction non-void (of non-void function). Ou en d'autres termes, que tu as déclaré que ta fonction retournait quelque chose, mais qu'en fait elle ne retourne rien ! Ca peut être sans conséquence (mais alors fais de ta fonction une fonction void f()), ou pas (c'est le cas de ton exemple). Il te faut donc corriger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ostream& operator <<(ostream& out, Case B){					
       out << "ligne= "<<B.getX() <<" "<<"colonne= " << B.getY() <<" "<<"etiquette= "<<B.getEtiq()<< endl;
     
      return out;
    }
    Apprendre.cpp:77: error: passing `const Case' as `this' argument of `int Case::getX()' discards qualifiers
    Là, il faut maîtriser le mot-clé const et sa signification. Lorsqu'un argument d'une fonction est déclarée const, tu indiques au compilateur que l'objet ne sera pas modifié. Tu ne peux donc appeler que les fonctions membres qui ne modifient pas l'objet. Ce sont celles que tu déclares avec const à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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() const {return x;}
    	int getY() const {return y;}

  3. #3
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ostream& operator <<(ostream& out, Case B){					
       out << "ligne= "<<B.getX() <<" "<<"colonne= " << B.getY() <<" "<<"etiquette= "<<B.getEtiq()<< endl;
    
      return out; j'ai complètement oublié celle là 
    }

    Là, il faut maîtriser le mot-clé const et sa signification. Lorsqu'un argument d'une fonction est déclarée const, tu indiques au compilateur que l'objet ne sera pas modifié. Tu ne peux donc appeler que les fonctions membres qui ne modifient pas l'objet. Ce sont celles que tu déclares avec const à la fin :

    et la signification de çà et la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (const Case& B) et (const Case& B) const 

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017

  5. #5
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut
    voici comment j'ai déclaré et implémenter la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ostream &operator<<(ostream& out ,Case B); // surcharge de l'operateur << afin d'afficher une case 
    
    ostream& operator<<(ostream& out, Case B){
    					
    									
    					out << "ligne= "<<B.getX() <<" "<<"colonne= " << B.getY() <<" "<<"etiquette= "<<B.getEtiq()<< endl;
    					return out ;
    					}
    et il me retourne ce genre de message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Apprendre.cpp:26: error: `std::ostream& Case::operator<<(std::ostream&, Case)' must take exactly one argument
    j'ai essayé de faire mais çà bug complètement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ostream &operator<<(Case B);
    
    ostream& operator<<( Case B){
    					
    			ostream& out;						
    					out << "ligne= "<<B.getX() <<" "<<"colonne= " << B.getY() <<" "<<"etiquette= "<<B.getEtiq()<< endl;
    					return out ;
    					}

  6. #6
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut
    non , je me suis trompé :
    pour la déclaration il faut juste l'objet argument
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ostream &operator<<(Case B); // surcharge de l'operateur << afin d'afficher une case
    mais pour l'implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ostream &operator<<(ostream &out, Case B)
    je viens de jeter un coup d'oeil sur FAQ C++
    merci !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de connexion sur une base SQLite en utilisant les exemples
    Par COGAN dans le forum Bases de données
    Réponses: 5
    Dernier message: 24/08/2010, 15h48
  2. Réponses: 0
    Dernier message: 03/04/2008, 15h14
  3. Réponses: 0
    Dernier message: 07/12/2007, 13h12
  4. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58
  5. [Access] Requête sur une table et tri sur une autre
    Par VooDooS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo