Partage
  • Partager sur Facebook
  • Partager sur Twitter

La surcharge d'opérateurs

`m_heures' undeclared (first use this function) o_O ?

7 juin 2007 à 22:25:00

Bonsoir a tous,

Je suis en train de voir le chapitre sur la surcharge d'opérateurs et je rencontre un probleme:
Project   : Console application
Compiler  : GNU GCC Compiler (called directly)
Directory : D:\Documents and Settings\Nicolas\Mes documents\Programation\duree\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.cpp
Compiling: Duree.cpp
Duree.cpp: In function `Duree operator+(const Duree&;)':
Duree.cpp:26: error: `m_heures' undeclared (first use this function)
Duree.cpp:26: error: (Each undeclared identifier is reported only once for each function it appears in.)
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings

Je pense avoir bien compris le cours mais la ca m'echape, je vous met le code:
main.cpp:
#include <iostream>

#include "Duree.h"

using namespace std;

int main()
{
        Duree duree1(0,65,65);

        return 0;
}

Duree.h:
#ifndef DEF_DUREE
#define DEF_DUREE

class Duree
{
    public:

    Duree(int heures = 0, int minutes = 0, int secondes = 0);

    Duree operator+(const Duree &duree);

    private:

    int m_heures;
    int m_minutes;
    int m_secondes;

};

#endif

et Duree.cpp:
#include <iostream>

#include "Duree.h"

using namespace std;

Duree::Duree(int heures, int minutes, int secondes) : m_heures(heures),
m_minutes(minutes), m_secondes(secondes)
{
    if(secondes > 59)
    {
        m_secondes %= 60;
        m_minutes = minutes + secondes / 60;
    }
    if(minutes > 59)
    {
        m_minutes %= 60;
        m_heures = heures + minutes / 60;
    }
}

Duree::Duree operator+(const Duree &duree)
{
    int heures = m_heures;
    int minutes;
    int secondes;
}


Voila c'est surement tres bete mais je voie pas pourquoi il me dit que m_heures n'est pas declarer.

Merci de votre aide.

Edit: Desole, je vien de voir ma connerie.
Donc les autres comme moi ( y'en a d'autre rassurez moi !) qui vont se prendre la tete en fait c'est pas:
Duree::Duree operator+(const Duree &duree)// c'est la que ca se passe
{
    int heures = m_heures;
    int minutes;
    int secondes;
}

mais:
Duree Duree::operator+(const Duree &duree)//hahaha! faut le voir celui la! :lol:
{
    int heures = m_heures;
    int minutes;
    int secondes;
}


voila encore dsl pour ce poste inutile!
  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2007 à 22:45:18

il manque le type de retour dans la déclaration de ton opérateur
  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2007 à 22:56:26

minirop merci, j'avais en fait pas fini mon operateur enfin pas cette fois, je bloquer sur cette erreur que je signal dans mon premier post(que j'ai editer).

Je trouve que M@theo passe un peut vite sur cette subtilite, enfin j'suis p'tetre le seul qui c'est fait avoir.
je la remet encore une fois pour les autre^^

pour la definition des surcharge d'opérateurs c'est pas:
Duree::Duree operator+(const Duree &duree)

mais:
Duree Duree::operator+(const Duree &duree)


voila merci a tous.

Edit:

Citation : minirop

il manque le type de retour dans la déclaration de ton opérateur

Ce qui fait qu'il manquer le type de retour dans la definition(?) de mon operateur en fait, je vien de comprendre merci!
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2007 à 14:38:07

Il y a un lien pour mettre ce sujet en résolu (ou une case à coché... je ne sais pas j'ai jamais fait de sujet) quelque part. Trouve le et clic dessus!

Petite précision : la surcharge d'opérateur c'est comme une méthode de classe :

class Bidon
{
  Bidon();
  int FaitRien();
}

Bidon::Bidon() {}
int Bidon::FaitRien() { return 666; }


tu vois c'est comme pour ton opérateur ( ... Duree::operator+(...) )
il y a un type de retour, un nom, 0, 1 ou plusieurs paramètres et un traitement.

Je ne sais pas si tu te souviens, l'opérateur :: (Oui c'est un opérateur mais il n'est pas surchargeable puisqu'il sert à la compilation et non au traitement) est appelé Opérateur de Résolution de Portée i.e. Il sert à s'assurer qu'on utilise bien la bonne fonction (ou qu'on définie bien la bonne) car si tu as le droit de te faire un objet nommé cout dans une classe et qu'il en existe aussi un autre dans l'espace global et un dans l'espace nommé std. Imagine si c'était impossible, on aurait tous des noms de fonctions énormes!
  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2007 à 17:05:48

Bonjour,

Merci MatteX pour les explications, pour ce qui est de l'option resolue,
je la trouve bien en repondant mais pas en editant. o_O
  • Partager sur Facebook
  • Partager sur Twitter