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 :

Surcharge des opérateurs ?


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mars 2012
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Surcharge des opérateurs ?
    Bonjour les amis, j'ai un petit problème à propos de la surcharge des opérateurs
    J'ai deux classes qui sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Cellule{
    double note ;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Ligne{
    vector<string> matiere;
    Cellule celule;
    public :
    friend  std::ostream & operator << (ostream &os, Ligne &ld);
    };
    Pour la surdéfinition de l'operateur<< j'ai fait comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     ostream& operator<<(ostream &os, Ligne& ld)
     {
              os<< ld.matiere<<"matiere"<<ld.cellule<<"cellulee"<<endl;
              return os;
              }
    Mais dans l'execution il me donne l'erreur dans cette ligne : os<< ld.matiere<<"matiere"<<ld.cellule<<"cellulee"<<endl;
    Ce qu'il m'écrit c'est : no match for 'operator<<' in 'os << ld->Ligne::matiere'

    J'ai pas compris l'erreur et que dois je faire ?Pouuriez vous m'aider s'il vous plait ?
    Merci d'avance ^^

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    ld.matiere est de type std::vector<std::string>.
    Par défaut, operator<< n'est pas défini pour std::vector. Il faudra le définir toi même, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // std::vector display
    template <typename _CharT, typename _ItemT>
    static std::basic_ostream<_CharT>& operator<<(std::basic_ostream<_CharT>& stream, const std::vector<_ItemT>& v) {
        typedef typename std::vector<_ItemT>::const_iterator _IterT;
     
        for (_IterT beg=v.begin(), it=beg, end=v.end(); it!=end; ++it)
        {
            if (it==beg) stream << "[ ";
            stream << (*it) << " ";
            if (it==end-1) stream << "]";
        }
     
        return stream;
    }
    Note que operator<< doit être défini pour _ItemT (ce qui est le cas avec std::string).

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mars 2012
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    C'est dure tout ca

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Bon, j'avoue qu'il y aurait peut-être plus simple (mais moins générique) dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ostream& operator<<(ostream &os, Ligne& ld)
    {
              for (int i=0, iEnd=ld.matiere.size(); i<iEnd; ++i) {
                  os << ld.matiere[i] << " ";
              }
              os<< "matiere"<<ld.cellule<<"cellulee"<<endl;
              return os;
              }
    }
    NB: Tu ne pourras pas non plus envoyer ld.cellule tel quel dans un flux.
    Donc tout bien réfléchi, je te conseille de créer des méthodes toString() dans Cellule et dans Ligne pour faciliter les choses :

    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
     
     
    class Cellule{
      double note ;
    public:
      std::string toString() const { return std::to_string(note); }
    };
     
    class Ligne{
      vector<string> matiere;
      Cellule celule;
    public :
      std::string toString() const { 
        // Matiere
        std::stringstream ss; // Requiert #include <sstream>
        for (int i=0, iEnd=ld.matiere.size(); i<iEnd; ++i) {
          ss << matiere[i] << " ";
        }
        ss << "matiere";
     
        // Cellule
        ss << cellule.toString() << "cellule"<<endl;
     
        // On retourne la chaine complete
        return ss.str();
      }
    };
     
     
    int main() {
      Ligne ligne(...);
      cout << "Ligne : " << ligne.toString() << endl;
    }

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mars 2012
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Merci
    J'ai quelque problème dans l'execution de ce code...
    S'il vous plait dans la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Cellule{
      double note ;
    public:
      std::string toString() const { return std::to_string(note); }
    };
    Pourquoi on doit déclarer tostring() ?
    et to_string(note) c'est une autre fonction ? elle n'est pas reconnue
    Donc que dois je mettre s'il vous plait ^^
    Et pour la classe :
    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
    class Ligne{
      vector<string> matiere;
      Cellule celule;
    public :
      std::string toString() const { 
        // Matiere
        std::stringstream ss; // Requiert #include <sstream>
        for (int i=0, iEnd=ld.matiere.size(); i<iEnd; ++i) {
          ss << matiere[i] << " ";
        }
        ss << "matiere";
     
        // Cellule
        ss << cellule.toString() << "cellule"<<endl;
     
        // On retourne la chaine complete
        return ss.str();
      }
    };
    ld n'est pas definit et quand je declare Ligne ld dans la classe Ligne, elle n'est pas accéptée
    Veuillez me corriger s'il vous plait et merci

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Ah, oui. Il faut activer C++11 pour utiliser std::to_string() (qui est une fonction de la librairie standard du C++, cf doc)
    Soit tu ajoutes -std=c++0x à tes options de compilation, soit tu remplaces par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string toString() const {
      std::stringstream ss;
      ss << note;
      return ss.str();
    }
    A ne pas confondre avec Ligne::toString() et Cellule::toString() qui sont des méthodes permettant de "convertir" des objets de type Ligne et Cellule en std::string, pour faciliter leur affichage.

    Par rapport à ld, c'est un oubli de ma part, il faut bien entendu l'enlever. 'matiere' est un attribut de Ligne, donc une méthode comme toString() peut y accéder directement. Donc matiere.size() seulement.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mars 2012
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Au fait je voulais afficher le nom de chaque matiere et sa note et j'ai fait une fonction d'affichage et vu qu'il faut définir l'operateur<< pour pouvoir afficher l'objet j'ai fait comme suit :

    mon fichier.h
    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
     
    class Cellule{
      double note ;
    public:
    std::string toString() const {
            std::stringstream ss;
            ss << maValeur;
            return ss.str();
    };
    class Ligne  {
          public :
     friend  std::ostream & operator << (ostream &os, Ligne &ld);
    std::string toString() const { 
     
        // Matiere
        std::stringstream ss; // Requiert #include <sstream>
        for (int i=0, iEnd=matiere.size(); i<iEnd; ++i) {
          ss << matiere[i] << " ";
        }
        ss << "matiere";
     
        // Cellule
        ss << cellule.toString() << "cellule"<<endl;
     
        // On retourne la chaine complete
        return ss.str();
      }
    void Afficher();
    };
    mon fichier.cpp
    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
    ostream& operator<<(ostream &os, Ligne& ld)
    {
              for (int i=0, iEnd=ld.matiere.size(); i<iEnd; ++i) {
                  os << ld.matiere[i] << " ";
              }
              os<< "matiere"<<ld.cellule<<"cellulee"<<endl;
              return os;
              }
     
     
    void Ligne :: Afficher(){
         typedef std::map<std::vector<string>, Cellule> cel;
         cel a;
         cel :: iterator it;
     
    for (it = a.begin (); it != a.end (); ++it){
    std::vector<string> key = (*it).first;
     
          Cellule number = (*it).second;
     
          std::cout << "name = " << key << "  number = " << number << std::endl;
    }}
    Mais le problème se pose toujours c'est qu'il ne reconnait pas la dernière ligne qui est : std::cout << "name = " << key << " number = " << number << std::endl; malgré l'operateur que j'ai declaré
    d'ou viens l'erreur qu'est ce qu'il faut faire s'il vous plait

  8. #8
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut, ça fait un peu Java tout ces toString

    C'est un peu inutile de faire le toString et de surcharger l'opérateur <<, je pense que c'est mieux de choisir un des deux.

    Pour ce qui est de ton erreur c'est parce que key est de type std::vector<std::string> et que comme dit précédemment l'opérateur << n'est pas surchargé. Si tu as réglé ce problème il faut alors que tu surcharges l'opérateur << de la classe Cellule pour pouvoir afficher une cellule (dans ton programme c'est number) et non pas surcharger celui de la classe Line.

    D'une façon plus général je pense que tu t'emmêles les pinceaux à utiliser plusieurs fonctions qui te permette d'afficher un objet (toString(), Afficher(), <<). Choisis en une et utilise la même partout (préférentiellement l'opérateur << car plus pratique à utiliser.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mars 2012
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour, je vous remercie tous pour votre aide

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

Discussions similaires

  1. surcharge des opérateurs
    Par Arson dans le forum C++
    Réponses: 9
    Dernier message: 30/05/2008, 11h40
  2. Réponses: 2
    Dernier message: 11/01/2008, 10h40
  3. Réponses: 7
    Dernier message: 02/12/2007, 21h43
  4. Surcharge des opérateurs ?
    Par kedare dans le forum Ruby
    Réponses: 3
    Dernier message: 06/11/2006, 23h47
  5. Variables polyvalentes et surcharge des opérateurs
    Par Antoine_935 dans le forum C++
    Réponses: 14
    Dernier message: 08/09/2006, 12h38

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