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 :

comment surcharger l'opérateur << pour une classe qui pointe vers une autre classe


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 comment surcharger l'opérateur << pour une classe qui pointe vers une autre classe
    Bonjour ,
    voici le bout du code :
    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
    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;}
    	void setX(int a){x = a;}
    	void setY(int b){y=b;}
    	void setEtiq(char C){etiq = C;}
    	char getEtiq()const{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<<(Case B); // surcharge de l'operateur << afin d'afficher une case
    	ostream &operator<<(Case* B); // on surcharge pour pouvoir afficher un pointeur sur Case 
    	
    	};
    
    ostream &operator<<(ostream &out, Case B){
    					
    									
    					out << "ligne= "<<B.getX() <<" "<<"colonne= " << B.getY() <<" "<<"etiquette= "<<B.getEtiq()<< endl;
    					return out ;
    					}
    
    			ostream &operator<<(ostream &out, Case* B){
    					
    									
    					out << "ligne= "<<B->getX() <<" "<<"colonne= " << B->getY() <<" "<<"etiquette= "<<B->getEtiq()<< endl;
    					return out ;
    					}
    
    				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();
    	Case* getPiece(){return place;}
    	void setPiece( Case& B1){place = &B1;}
         void Deplacer(int ligne , int colonne); // pour pouvoir le déplacer 
         void DeplacerCase(Case& B); // délacement à partir d'une case 
    	void Afficher1();
    	ostream &operator<<(Piece B) ;
    				
    	
    	};
    
    void Piece::Afficher1(){
    					
    	cout << "renseignement sur cette pièce " << *this << endl ; //ici il y a une erreur 
    					
    				}
    
    ostream &operator<<(ostream &out, Piece B){
    					
    									
    		out << "ligne= "<<(B.getPiece())->Afficher() << endl;
    					return out ;
    					}
    l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    1> : error C2679: '<<' binaire*: aucun opérateur trouvé qui accepte un opérande de partie droite de type 'void' (ou il n'existe pas de conversion acceptable)
    main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Case P1;
    P1.Afficher(); // çà marche 
     
    Case P2(2,3,'C');
    P2.Afficher(); // y a un souci

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Peut être cette entrée de la FAQ correspond-elle à ce que tu cherche à faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    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,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Piece {
    private:
    	Case* place; // je pensais qu'une pièce pointe sur une case 
    		
    public:
    	Piece();
    	~Piece();
    	Case* getPiece(){return place;}
    	void setPiece( Case& B1){place = &B1;}
         void Deplacer(int ligne , int colonne); // pour pouvoir le déplacer 
         void DeplacerCase(Case& B); // délacement à partir d'une case 
    	void Afficher1();
    	ostream &operator<<(Piece B) ;
    	};
    L'opérateur<< est déclaré comme fonction membre de la classe Piece. Or la spécialisation de l'opérateur ne s'applique pas à un objet Piece mais à un objet std::ostream. Donc, tu devrais le déclaré comme fonction libre. :
    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
    	ostream &operator<<(Piece B) ;
    	
    class Piece {
    private:
    	Case* place; // je pensais qu'une pièce pointe sur une case 
    		
    public:
    	Piece();
    	~Piece();
    	Case* getPiece(){return place;}
    	void setPiece( Case& B1){place = &B1;}
         void Deplacer(int ligne , int colonne); // pour pouvoir le déplacer 
         void DeplacerCase(Case& B); // délacement à partir d'une case 
    	void Afficher1();
    };
    P.S. : ta fonction afficher devrait être const. As-tu compris les liens fournis dans une de tes précédentes questions ?

  4. #4
    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
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Piece {
    private:
    	Case* place; // je pensais qu'une pièce pointe sur une case 
    		
    public:
    	Piece();
    	~Piece();
    	Case* getPiece(){return place;}
    	void setPiece( Case& B1){place = &B1;}
         void Deplacer(int ligne , int colonne); // pour pouvoir le déplacer 
         void DeplacerCase(Case& B); // délacement à partir d'une case 
    	void Afficher1();
    	ostream &operator<<(Piece B) ;
    	};
    L'opérateur<< est déclaré comme fonction membre de la classe Piece. Or la spécialisation de l'opérateur ne s'applique pas à un objet Piece mais à un objet std::ostream. Donc, tu devrais le déclaré comme fonction libre. :
    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
    	ostream &operator<<(Piece B) ;
    	
    class Piece {
    private:
    	Case* place; // je pensais qu'une pièce pointe sur une case 
    		
    public:
    	Piece();
    	~Piece();
    	Case* getPiece(){return place;}
    	void setPiece( Case& B1){place = &B1;}
         void Deplacer(int ligne , int colonne); // pour pouvoir le déplacer 
         void DeplacerCase(Case& B); // délacement à partir d'une case 
    	void Afficher1();
    };
    P.S. : ta fonction afficher devrait être const. As-tu compris les liens fournis dans une de tes précédentes questions ?
    oui merci !!
    pour la fonction libre

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

Discussions similaires

  1. Droits pour exécuter une vue qui pointe vers une autre base ?
    Par fredg9 dans le forum Administration
    Réponses: 3
    Dernier message: 08/11/2012, 13h21
  2. bouton qui pointe vers une page jsp
    Par redabadache3 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/10/2007, 14h33
  3. Une Combobox, qui redirige vers une Feuille
    Par Didpa dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/11/2006, 11h42
  4. [j3d] afficher une ligne qui point vers un objet
    Par guitalca dans le forum 3D
    Réponses: 1
    Dernier message: 06/03/2006, 21h44
  5. [Frames] un lien vers une page de Frames vers une page sans
    Par jamesleouf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/09/2005, 18h25

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