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

Langage C++ Discussion :

ajout de conversion à des classes figées


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut ajout de conversion à des classes figées
    bonjour,

    voilà mon problème, j'ai 2 classes D3DXVECTOR3 et Vector3f définis (presque) de la même manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public :
        float x;
        float y;
        float z;
    et je voudrai pouvoir faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    D3DXVECTOR3 u;
    Vector3f v
    u = v;
    ...
    v = u;
    le problème c'est que je ne peux pas toucher aux définitions des classes et y ajouter des opérations de conversion.
    quels seraient les possibilités qui s'offriraient à moi, ainsi que leurs efficacités?

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En priant pour que l'agencement mémoire soit identique, tu peux peut-être voir pour passer par un pointeur ou quoi. Mais à la rigueur, mieux vaut peut-être utiliser quelque chose comme boost::variant<D3DXVECTOR3, Vector3df>.

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Faire une fonction d'assignation en inline, dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    inline void Assign ( D3DXVECTOR3& Destination, Vector3f& Source ) {
        Destination.x = Source.x ;
        Destination.y = Source.y ;
        Destination.z = Source.z ;
    }
    Bien sûr, il t'en faut aussi une autre dans l'autre sens. Le passage par référence rajouté à l'inlining devrait coûter extrêmement peu de temps CPU, voire aucun.

    Tu mets ensuite dans ton code des appels "Assign(u,v);" au lieu de "u=v;".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    et pas de solution pour faire accepter la conversion direct par le compilateur, ajouter des conversions implicites ou autre?

    sinon que pensez vous de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inline D3DXVECTOR3 Cast(Vector3f& v) { return *((D3DXVECTOR3*)&v); }
    inline Vector3f Cast(D3DXVECTOR3& v) { return *((Vector3f*)&v); }
    (pas encore testé, pas de compilateur immédiatement sous la main ><)

  5. #5
    screetch
    Invité(e)
    Par défaut
    c-cast c'est très mal. Si tu prends cette direction utilise reinterpret_cast.

  6. #6
    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
    Par défaut
    Citation Envoyé par stardeath Voir le message
    et pas de solution pour faire accepter la conversion direct par le compilateur, ajouter des conversions implicites ou autre?

    sinon que pensez vous de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inline D3DXVECTOR3 Cast(Vector3f& v) { return *((D3DXVECTOR3*)&v); }
    inline Vector3f Cast(D3DXVECTOR3& v) { return *((Vector3f*)&v); }
    (pas encore testé, pas de compilateur immédiatement sous la main ><)
    Le jour où l'implémentation d'une des 2 classes changent, t'es mort
    Tant qu'à faire une fonction explicite, alors utilise quelque chose comme proposée par Mac LAK.

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par stardeath Voir le message
    et pas de solution pour faire accepter la conversion direct par le compilateur, ajouter des conversions implicites ou autre?
    Pas en C++, en tout cas : c'est la classe qui doit définir ses opérateurs, ils n'existent pas "tout seuls"... Des langages permettent ça, comme l'Ada, mais pas en C++.

    Par contre, tu peux utiliser du cross-casting au besoin, même si à titre personnel je trouve ça assez crasseux (rapport à l'héritage multiple surtout)... C'est légal, toutefois, et cela peut marcher parfaitement bien. Je préfère quand même utiliser une fonction d'affectation inline quoi qu'il en soit, c'est plus portable, plus propre et cela limite au maximum les problèmes. De plus, même si c'est à mesurer, il est probable que la fonction d'assignation inline reste supérieure en terme de performances par rapport à un déréférencement avec casts...

    Pour le cast "bourrin", c'est quand même à éviter de façons générale : il faut voir les définitions exactes et précises de chacune de ces classes, et surtout, l'alignement mémoire utilisé pour chacune d'entre elles (vérifiable via le sizeof de chaque classe notamment)... De plus, la syntaxe est alors assez laide.


    Note : Tu devrais éviter comme la peste les casts "type C" dans du C++, c'est juste un nid à m..... Cf. ce topic par exemple. Utilises à la place les casts C++.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    ok merci à tous, je vais suivre la proposition de Mac LAK.

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

Discussions similaires

  1. Comment ajouter la doc des classes dans l'IDE
    Par patmaba dans le forum JDeveloper
    Réponses: 1
    Dernier message: 26/12/2008, 04h42
  2. Réponses: 3
    Dernier message: 11/03/2008, 07h31
  3. Ajouter des classes au ClassPath en cours d'exécution
    Par cyrille37 dans le forum Général Java
    Réponses: 1
    Dernier message: 31/10/2007, 19h17
  4. ajouter des classes à une app déployée
    Par barhili04 dans le forum C#
    Réponses: 4
    Dernier message: 25/05/2007, 12h57
  5. [debutant] Comment ajouter des .class ?
    Par Slein dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 30/04/2004, 14h30

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