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 :

Surchage opérateur d'assignation =


Sujet :

C++

  1. #1
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut Surchage opérateur d'assignation =
    Bonjour,

    J'ai deux classes: class Point3D et class Vector3D. Je souhaiterais pouvoir convertir un objet d'un type vers l'autre (il suffit de recopier 3 valeurs en gros...). J'ai essayé de surcharger l'opérateur = dans les deux classes mais mon compilateur (Visual) me dit qu'il ne connaît pas Point3D dans la classe vecteur (pourtant j'ai bien #include "Point3D" dans ma classe Vecteur3D et #include "Vector3D" dans ma classe Point3D) mais on dirait que cette référence croisée, lui emmêle les pinceaux! Voici mes surcharges:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gPoint3D& operator =(const gVector3D& v);      //Convert a 3D-vector to a 3D-point
    gVector3D& operator =(const gPoint3D& p);         //affectation
    ==> erreur : "missing type specifier"/ donc il ne connaît pas gPoint3D
    Est-ce que cela vous semble correct? Peut-on croiser les assignations?

    Merci d'avance!
    Cordialement,
    Rodrigue
    Rodrigue

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est normal si Vecteur3D.h inclut Point3D qui inclut Vecteur3D que lors de la déclaration de Point3D, il ne sache rien de Vecteur3D si tu as mis des #ifndef...
    Fais une déclaration anticipée de la structure Vecteur3D et Point3D dans les headers opposés.

  3. #3
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Par "header opposés", tu veux dire que je mette:
    #include "Point3D.h" avant #ifndef dans mon fichier "Vector3D.h" et,
    #include "Vector3D.h" avant #ifndef dans mon fichier "Point3D.h"?
    J'ai une erreur à la compilation: too many include files...
    Ben ouais ça boucle! Point3D appelle, Vector3D qui appelle Point3D etc.
    Rodrigue

  4. #4
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Je ne dois pas mettre "extern class" qqchose... pour lui dire qu'elle existe?
    Rodrigue

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Non, j'ai dit déclaration anticipée, donc un truc style :
    dans Vecteur3D.h
    Et tu as bien mis des protections contre les boucles d'include ? Avec les #ifndef ?
    Par ce que vu ce que tu as indiqué, ce n'est pas le cas.

  6. #6
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Oui oui j'en ai...
    en fait c'est :
    Rodrigue

  7. #7
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Magnifique ça fonctionne , j'ai réussi à compiler !
    T'es le meilleur ...

    Encore un petit problème!
    Quand j'essaye d'affecter un Point3D à un Vecteur3D, il ne veut pas :
    cannot convert from 'gPoint3D' to 'gVector3D'
    Voici mes déclarations dans ma classe Vector3D:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    gVector3D& operator =(const gPoint3D& p); //affectation
     
    /**
    *: = operator
    **/
    gVector3D& gVector3D::operator =(const gPoint3D& p)
    {
    x = p.x;
    y = p.y;
    z = p.z;
    return (*this);
    }
    
    Il devrait pouvoir me convertir mon Point3D sans problème, non?
    En fait je voudrais être capable de caster mon Point3D dans un calcul où j'ai besoin d'un produit scalaire (qui n'est déclaré que pour mes vecteurs)...
    Rodrigue

  8. #8
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Ne te dérange pas ... Il fallait définir une constructeur du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    gVector3D(const gPoint3D& Point);
    
    Encore Mille fois Merci !
    Rodrigue

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Rodrigue
    Oui oui j'en ai...
    en fait c'est :
    Mais ce n'est pas portabl eet risqué.
    Il faut faire des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef DANSMONHEADER_MACHIN_H
    #define DANSMONHEADER_MACHIN_H
     
    //Mon code
     
    #endif

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Personnellement, je conseille de mettre les deux.
    cf. http://www.developpez.net/forums/showthread.php?t=16767
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  11. #11
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Et zut! Je me suis amusé à changer tous mes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef
    #define
    ...
    #endif
    en Bon ben on recommence !

    Merci pour l'astuce. Je vais mettre les deux alors...
    Rodrigue

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Bof... A mon avis, le temps gagné en plaçant des #pragma once supplémentaires ne doit pas être transcendant.

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Ca dépend de la taille du projet, et, bien sûr, du compilo. Mais bon, c'est clair que tant que le projet ne contient pas plus de, disons, une centaine de fichiers, la différence doit être dérisoire.

    P.S: je ne trouve pas de comparatif sur le net
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  14. #14
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Quand j'essaye d'affecter un Point3D à un Vecteur3D, il ne veut pas :
    Tu ne réalises probablement pas une vraie affection.
    Quelle est l'opération en question ?
    Boost ftw

  15. #15
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Merci Loufoque pour ton aide mais la solution a déjà été trouvée (cf mon message de 12h08). Je pensais avoir mis le message a résolu, je m'excuse! - programmer nuit gravement à la santé mentale -.

    J'ai créer une constructeur dans ma classe Vector3D qui prend en paramètres un Point3D. Cela me permet de caster un point3D en vector3D très facilement dans mes formules. J'ai fait l'inverse dans ma classe Point3D, comme ça je peux faire des conversions à la volée... C'est géant

    Merci beaucoup pour votre aide!
    Rodrigue

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

Discussions similaires

  1. Surcharge idéale de l'opérateur d'assignation ?
    Par damien.flament dans le forum Langage
    Réponses: 9
    Dernier message: 28/08/2010, 14h41
  2. Réponses: 18
    Dernier message: 17/07/2010, 15h03
  3. Problème dans un opérateur d'assignation
    Par deubelte dans le forum C++
    Réponses: 5
    Dernier message: 19/03/2010, 12h46
  4. Surchage opérateur & instanciation dynamique
    Par winzzz dans le forum Débuter
    Réponses: 2
    Dernier message: 28/10/2008, 13h24
  5. Surchage opérateurs de flux
    Par Jbx 2.0b dans le forum SL & STL
    Réponses: 10
    Dernier message: 25/03/2008, 09h47

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