Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Officiels > Programmation > Lecture des commentaires

Vos commentaires sur :
La surcharge d'opérateurs

Retour au tutoriel

Vous devez être inscrit pour pouvoir poster des messages

Page : 1  2 
Pseudo Commentaire
Page : 1  2 
Hors ligne Cyprien_ # Posté le 17/05/2007 18:36:14
Le Monde d'Akhiris
Avatar
Groupe : Membres
Toute petite erreur dans la partie sur les opérateurs de flux:

Citation : M@teo21
Code : C++
cout.operator<<("Coucou !");
cin.operateor>>(variable);


un e en trop.

A part ça, c'est toujours aussi excellent !

19/20 :D

Un jeu online novateur ?
Le Monde d'Akhiris !
 
Hors ligne cookieslover # Posté le 17/05/2007 18:39:47
CookieKiss !
Avatar
Groupe : Membres
Merci beaucoup pour ce tutorial :)

Image utilisateur
Image utilisateur
 
Hors ligne ryan07 # Posté le 17/05/2007 18:42:06
Groupe : Bannis
Super

rien de plus clair
 
Hors ligne shadosan # Posté le 17/05/2007 19:01:22
WRYYYYYYYY !!
Avatar
Groupe : Membres
oula c'est puissant !

Secret (cliquez pour afficher)
20.005/20 !
 
Hors ligne ddx39 # Posté le 17/05/2007 19:45:08
Avatar
Groupe : Membres
Beau travail :)

Image utilisateur
 
Hors ligne psychoh13 # Posté le 17/05/2007 20:02:58
L'esprit surpasse le corps !
Avatar
Groupe : Membres
je voudrais savoir... ne serait-il pas plus simple de mettre les valeurs par défaut dans la déclaration de la classe et de supprimer le constructeur par défaut comme suit :

Code : C++
class Duree
{
    public :
        Duree(int heures = 0, int minutes = 0, int secondes = 0);
   
    private :
        int m_heures;
        int m_minutes;
        int m_secondes;
};


plutôt que d'écrire ça qui fait écrire deux constructeur exactement pareil à ceci prés que l'un a des valeurs par défaut et l'autre aucune valeur ?

Code : C++
Duree::Duree() : m_heures(0), m_minutes(0), m_secondes(0)
{
}

Duree::Duree(int heures = 0, int minutes = 0, int secondes = 0) : m_heures(heures), m_minutes(minutes), m_secondes(secondes)
{
}


Étant donné qu'un constructeur qui a des valeurs par défaut pour chacun de ses arguments fait office de constructeur par défaut...

¡ Psycho !
Image utilisateur
Tutoriel Programmation Mac disponible !
Meilleur langage objet : Objective-C
Meilleur langage procédural : C
Meilleure API : Cocoa
Meilleur IDE : Xcode
Meilleure plate-forme : Mac OS X
 
Hors ligne BlastRock # Posté le 17/05/2007 20:34:40
Groupe : Membres
Bon tuto à part un petit point
Citation : M@teo21
Tous ces opérateurs de comparaison ont un point en commun particulier : ils renvoient un booléen

J'ai fait un petit programme de test où l'operateur == revoie une std::string, ça fonctionne. Mais je sais pas si c'est autorisé par l'ISO et les autres normes, je sais encore moins si c'est utile ^^ mais ça fonctionne.
Pour tester :
Code : C++

#include <string>
#include <iostream>

class truc
{
  public:
    std::string operator==(truc& o)
    {
      return "aa";
    }
};

int main () {
  truc a, b;
  std::cout << (a == b) << std::endl;
}

Ça marche avec gcc 4.1.1-r3.

Donc, pour ce tuto, 19/20 ^^
Hors ligne B2Moo # Posté le 17/05/2007 22:03:37
JS ? où ça ? où ça ??!!
Avatar
Groupe : Membres
Je comprend pas:Code : C++
Duree Duree::operator=(const Duree &duree)
{
    m_heures = duree.m_heures;
    m_minutes = duree.m_minutes;
    m_secondes = duree.m_secondes;
}
Si le type de la méthode est Duree, il ne devrait pas y avoir un return ?

Je ne ponds pas vos scripts !! ;) (cot cot)
Je veux bien vous aider par contre :) , à condition d'expliquer clairement votre problème: exemple, codes, et surtout messages d'erreurs
big-tuto sur la gestion de la souris en js.
 
Hors ligne Vizigr0u # Posté le 18/05/2007 02:23:52
fooo !
Avatar
Groupe : Membres
Le tuto est comme d'habitude très bien expliqué etc...
Mais je me suis posé une question en lisant : comment le compilateur traite-t-il les priorités entre les opérateurs ?
Bon après avoir testé en faisant objet * objet1 + objet2 j'ai vu que C++ distributait tout seul les priorités : * passe avant + etc...
Citation : M@téo21
Code : C++
resultat = duree1 + duree2 + duree3
revient à écrireCode : C++
resultat = duree1.operator+(duree2.operator+(duree3));
m'avait en effet laissé penser que le compilateur effectuait un parenthésage implicite à droite (enfin bon il fait les opérations de droite à gauche quoi ;) ) J'ai donc pensé que ca serait bien de préciser que les opérateurs gardent leur priorité lors de la surcharge d'opérateur (à moins que je ne sois le seul à m'être posé la question mais j'en doute, ou alors ils viendront, si si :-° ...)

Bon sinon pas vraiment d'autre remarque mis à part que je trouve que les fonctions de comparaisons sont codées assez lourdement et seraient plus claires en abrégeant la 1ere par Code : C++
bool Duree::operator==(const Duree &duree)
{
    return (m_heures == duree.m_heures && m_minutes == duree.m_minutes && m_secondes == duree.m_secondes);
}
et la 2nde par Code : C++
bool Duree::operator<(const Duree &duree)
{
    if (m_heures < duree.m_heures)
        return true;
    if (m_heures == duree.m_heures && m_minutes < duree.m_minutes)
        return true;
    if (m_heures == duree.m_heures && m_minutes == duree.m_minutes && m_secondes < duree.m_secondes)
        return true;
    return false;
}
Mais bon j'imagine que ce sont des habitudes qui font que l'on lit mieux un code codé d'une façon ou d'une autre :p (remarquez que je n'ai pas tout mis dans une seule condition pour la 2ème quand même, non honêtement je trouve ca plus clair de ma manière mais bon je ne peux pas prétendre avoir l'expérience suffisante du code pour critiquer les autres méthodes)

Enfin bon comme d'habitude c'est un point que je n'avais jamais cherché à apprendre avant de lire le tuto, et c'est clair, bien expliqué, pas trop lourd et ça aborde l'essentiel des points du sujet je trouve...

Hm mon PC a rebooté et je ne savais plus si j'avais posté ou pas de commentaire avant qu'il plante ou s'il avait planté pendant la rédaction mais je commence à me dire qu'en fait j'avais posté et que les commentaires sont désactivés sur les tutos officiels comme je n'en vois aucun sur les autres, donc bon ce commentaire risque de faire un peu radottage...

Image utilisateur


Une équipe, 4 membres, un projet : Project: HGF
www.fooo.fr
projet d'étudiants de l'EPITA
 
Hors ligne ryan07 # Posté le 18/05/2007 10:53:14
Groupe : Bannis
Super
 
Hors ligne rodulphe # Posté le 18/05/2007 12:21:26
Groupe : Membres
Je galérais sur les opérateurs comme sur les pointeurs.J'ai lu pendant 20 min ton tuto et hop tout capté !!! Merci !!!! Parfait le choix de la durée !!!! 20/20
Hors ligne Nyxem # Posté le 18/05/2007 14:57:47
ou pas
Avatar
Groupe : Membres
Plutot que de prendre des assesseurs on peut tout simplement déclarer la surcharge d'opérateur comme méthode 'amie' de la classe.

dans le .h :
Code : C++

friend ostream &operator<<(ostream &out, Duree &duree);
Hors ligne M@teo21 # Posté le 18/05/2007 17:37:17
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Oui mais j'ai volontairement refusé de parler des friend dans le cours pour un certain nombre de bonnes raisons ^^

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne tTz # Posté le 18/05/2007 22:33:43
Groupe : Membres
oulala la puissance o_O

Merci Mathéo !


Théo. :D

ps : j'hackerai bien le site afin de mettre 30 / 20 (je rigole bien sure :p )
Hors ligne mrbuisson # Posté le 19/05/2007 15:59:22
Avatar
Groupe : Membres
ya pas a dire ... c'est bô ...


que de problème je viens de résoudre avec cette surcharge d'opérateur :p
en plus sa permet au code d'etre plus clair et je trouve que sommer des objet comme sa c'est la classe (uhu)
ok je sort ...

chapeau !

La nature les fleurs et les ordinateurs
 
Hors ligne psychoh13 # Posté le 22/05/2007 15:42:35
L'esprit surpasse le corps !
Avatar
Groupe : Membres
M@TÉO : tu t'es trompé !

Tu n'as pas de constructeur par défaut dans ta source !

Il ne faut pas faire ça :

Code : C++
#ifndef DEF_DUREE
#define DEF_DUREE

class Duree
{
    public:

    // Aucun constructeur par défaut !
    Duree(int heures, int minutes, int secondes);

    private:

    int m_heures;
    int m_minutes;
    int m_secondes;
};

#endif

#include "Duree.h"

Duree::Duree(int heures = 0, int minutes = 0, int secondes = 0) : m_heures(heures), m_minutes(minutes), m_secondes(secondes)
{
}


Mais il faut faire ça :

Code : C++
#ifndef DEF_DUREE
#define DEF_DUREE

class Duree
{
    public:

    // Les valeurs par défaut doivent se trouver dans la DÉCLARATION de la classe...
    Duree(int heures = 0, int minutes = 0, int secondes = 0);

    private:

    int m_heures;
    int m_minutes;
    int m_secondes;
};

#endif

#include "Duree.h"

Duree::Duree(int heures, int minutes, int secondes) : m_heures(heures), m_minutes(minutes), m_secondes(secondes)
{
}


Les valeurs par défaut doivent se trouver dans la DÉCLARATION de la classe...

¡ Psycho !
Image utilisateur
Tutoriel Programmation Mac disponible !
Meilleur langage objet : Objective-C
Meilleur langage procédural : C
Meilleure API : Cocoa
Meilleur IDE : Xcode
Meilleure plate-forme : Mac OS X
 
Hors ligne SiMonkey # Posté le 22/05/2007 18:10:36
IVe internationale !
Avatar
Groupe : Membres
Trés chouette chapitre :)
sinon multiplier des durées peut-être utilisé, en physique le t² est souvent utilisé ;) (mais c'est vrai que ça reste en seconde :p )

Citation : Marx
Les philosophes n'ont fait qu'interpréter diversement le monde, il s'agit maintenant de le transformer.
 
En ligne lmghs # Posté le 22/05/2007 23:30:59
Groupe : Membres
Oups. J'avais complètement zappé où devaient aller les commentaires.
Mea maxima culpa.

Je mets le lien vers ma note:
-> http://www.siteduzero.com/forum-83-174 [...] html#r1346053

Petites précisions supplémentaires au sujet des valeurs par défaut pour les paramètres
-> http://www.siteduzero.com/forum-83-174 [...] html#r1349460

EDIT: maj des liens
 
Hors ligne smilz # Posté le 23/05/2007 16:02:45
La vie est une blague
Avatar
Groupe : Membres
Super, je comprend enfin vraiment comme la classe string faisait tous ces super truc, je crois que je vait me la programmer :D
Elle sera (légèrement) moins optimiser mais bon :-°

Rejoignez la team TMN du sdz !

Merci pour mon oncle (auteur, compositeur, interprète)
http://ericmaliet.com




 
Hors ligne congelli501 # Posté le 03/06/2007 12:23:35
Avatar
Groupe : Membres
Excellent tuto, vivement le prochain ! :)
Note : 20/20.

On dit que la Grèce antique beaucoup d'influence sur notre culture... C'est vrai : la chute d'Athènes a eu lieu en 404 avant JC. Ca vous rappelle quelque chose ? Si non, aller ici.
 
Hors ligne shadosan # Posté le 09/06/2007 01:43:17
WRYYYYYYYY !!
Avatar
Groupe : Membres
Petite remarque :

on peut surcharger ++ . exemple :

duree++;
++duree;

on doit simplement faire ceci :

pour ++duree :
Code : C++
void Duree::operator++()


et pour duree++ :
Code : C++
void Duree::operator++(int n)


on peux faire pareil avec -- ;)

seul chose que je ne sais pas, c'est l'utilité du "int" dans le second code... :euh:


(vue que j'ai déjà noté, je ne re-noterai pas ^^ )
 
Hors ligne Bigslider # Posté le 09/06/2007 15:09:28
Groupe : Membres
Bonjour Merci beaucoup pour ce super tuto ;)
Hors ligne remram44 # Posté le 16/06/2007 23:02:09
§ KCOMDL §
Avatar
Groupe : Membres
Un machin que je comprends pas, c'est pourquoi faire des opérateurs membres de la classe ?

Il me parait plus logique (c'est mon avis hein) de faire operator+(a, b) que a.operator+(b) surtout que ca correspond au prototype de la fonction "additionner()" dont tu parles au début du tuto.

Un oubli ? Ou tout simplement ne connais tu pas cette notation ?

Code : C++
class Truc {

    friend Truc operator+(const Truc&, const Truc&);

private:
    int A, B;

public:
    Truc(int a=0, int b=0);

};

Truc::Truc(int a, int b) : A(a), B(b)
{ }

Truc operator+(const Truc &a, const Truc &b)
{
    return Truc(a.A + b.A, a.B + b.B);
}

int main()
{
    Truc t1, t2;
    Truc t3 = t1 + t2;

    return 0;
}

Je sais très bien M@teo21 que tu ignores complètement mes commentaires désormais, comme tu me l'as annoncé si poliment sur je ne sais plus quel topic. Aussi si quelqu'un avait la bonté de lui répeter ce commentaire, ce serait sans doute utile.

Remarque également, tu ne parles pas des opérateurs unaires (c'est à dire * & + - ! () -- et ++ qui sont intéressants car existent en versions préfixée et postfixée).

Pour ceux que ça intéresse, pour différencier les deux versions de ++ et -- on passe un paramètre à la méthode, de type int (qui ne doit pas être utilisé).

---:--: g33k |ns|d3 :--:---
WikiNyug
 
Hors ligne SpotZup # Posté le 28/06/2007 02:43:16
Ceci est un panda
Avatar
Groupe : Membres
Super tuto, ça m'a vraiment intéressé et on sens bien qu'on avance, il nous faudrait presque un petit TP là (je sais, pourquoi demander quand on peut le faire tout seul ^^). Il reste pourtant une point qui me gène, lorque tu fais
Code : C++
ostream &operator<<( ostream &out, Duree &duree )
{
    duree.afficher(out) ;
    return out;
}

Pourquoi ne pas faire tout simplement ce qui suit ?
Code : C++
ostream &operator<<( ostream &out, Duree &duree )
{
    duree.afficher();
    return out;
}

Je suppose qu'il y a une bonne raison vu que je suis le seul que ça gène et que je débute, mais bon tout ce que je constate, c'est que ça marche. Et puis le "return out" je comprend pas à quoi il sert exactement puisqu'on à le même résultat sans lui (même en chaînant cout << duree1 << duree2...). Si quelqu'un passe par là et peut me répondre je lui serait très reconnaissant de m'envoyer un MP ou de l'écrire ici :)


Sinon, un petit truc sympa est de remplacer le contenu de la méthode afficher() par
Code : C
printf("%.2i:%.2i:%.2i",m_heures,m_minutes,m_secondes);

Ce qui permet d'afficher toujours deux chiffres, même si c'est des zéros (03:36:00 par exemple). Je sais que tu le sais, mais pourquoi ne pas le dire à tous ? ^^

----------= Diviser pour Régner =------------
>> ActionScripteur de 3ème génération <<
 
En ligne lmghs # Posté le 28/06/2007 23:30:26
Groupe : Membres
@SpotZup: La fonction affiche() prend en argument le flux destination où seront inscrits les résultats : que cela soit std::cout, un fichier, un stringstream ou tout autre flux plus évolué.
Sans argument, tu n'as plus accès au flux destination de l'opérateur d'injection (<<). Du coup, tu te retrouves à devoir faire un printf pour envoyer ... à l'écran et non vers le flux qui va bien.

Quant au "return out", sans lui ton compilo devrait refuser de compiler, et sans lui, rien ne sera envoyé au flux destinataire sur la seconde injection.

Concernant le formatage, sur le flux on utilise les formateurs de <iomanip> (si mes souvenirs sont bons, ils sont traités dans la FAQ C++ de developpez).


@remram44, tes remarques ont déjà été partiellement adressées dans de précédents posts -- j'ai même signalé l'écriture canonique avec +() (libre) écrit autour de +=() (membre). Je suppose que Matthéo n'a guère le temps de patcher son tuto pour l'instant, d'autant qu'il y avait une erreur plus génante (sur les valeurs par défaut pour paramètres des contructeurs)
 
Hors ligne genie2 # Posté le 28/08/2007 22:40:34
Groupe : Bannis
mais vraiment c'est nul Citation : allez savoir pourquoi!
je rigole :) :)

je donne 18/20
Hors ligne Dr.Tenma # Posté le 29/08/2007 23:36:06
Groupe : Membres
Moi je bloque et ya plein de chose que je pige pas, comme par exemple pourquoi mettre Duree Duree::operator+(......), pourquoi a t-on mis Duree au lieu de int/voir/rien
Et en plus je m'y perd, comme par exemple les reference c'est dur.
je trouve que l'orienté objet c'est trop compliqué.

ZBlack Skin For SdZzzz : http://sdz-designs.123.fr/zBlack
 
Hors ligne Sareth # Posté le 08/09/2007 13:30:17
Groupe : Membres
je connaissais le langage C, maintenant je connais plein de choses en C++ !
explications claires, choix des exemples pertinent...

merci M@teo !
Hors ligne c-sharp # Posté le 30/09/2007 19:38:18
le C/C++ j'en mange
Avatar
Groupe : Bannis
ce tuto manque cruellement d'informations(tu ne parles pas de friends...) ;)

<ta :euh: Qu'est ce que vous regardez?
 
Hors ligne zepiwane # Posté le 13/03/2008 13:47:38
Groupe : Membres
Coucou

D'abord, ce tuto est super. J'ai appris le C/C++ en BTS IRIS ya 2 ans et ce tuto m'a rafraichi la mémoire sur de nombreux points ; et malgrès ce que certains disent, ils est très complet. Je lis tout et fais des exos de ce tuto 6 heures par jours minimum !

Bref, j'ai une question : quand tu parles de la surcharge de l'opérateur (*), manque-t-il 'const' devant 'int'? :
Citation : M@teo21
Duree operator*(int nombre);

Tu peux retrouver ce passage 3 lignes avant ceci : http://www.siteduzero.com/tuto-3-16681-1-la-surcharge-d-operateurs.html#ss_part_3

Je sais que ce n'ai pas très important, c'est pour la forme ^^
Je n'ai pas la possibilité d'avoir un compilo pour le moment :( je fais tout avec notepad++ et ne peux donc pas vérifier avec compil.
Merci pour ta réponse et pour tous ces tutoriels (20/20) :D !

Vous devez être inscrit pour pouvoir poster des messages

Retour au tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 416 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.126s (0.1131s)