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++/CLI Discussion :

Appel d'un constructeur automatiquement


Sujet :

C++/CLI

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut Appel d'un constructeur automatiquement
    Bonjour,

    J'ai une classe Point4 qui ressemble à ceci:
    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
    template<class T> class Point4
    	{
    		public:
    			Point4(T Xu=0, T Yu=0, T Zu=0, T Wu=1);
    			Point4(const Point4<T> &);
     
    			Point4<T> operator +() const;
    			Point4<T> operator -() const;
    			Point4<T> operator +(const Point4<T> &) const;
    			Point4<T> operator -(const Point4<T> &) const;
    			const Point4<T>& operator +=(const Point4<T>& v);
    			const Point4<T>& operator -=(const Point4<T>& v);
     
    			//...
     
    			T X, Y, Z, W;
    	};
     
    	template <class T> Point4<T> operator /(const Point4<T> &, T t);
    J'ai ce code source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Point4<float> pointTransformed = (getLightProjectionMatrix() * getLightViewMatrix() * Point4<float>(0.0, 0.0, -0.2, 1.0)) / 2.0f + 0.5f;
    La multiplication des deux matrices avec le point fonctionne très bien ainsi que la division par 2.0f.
    Par contre le "+ 0.5f" ne fonctionne pas comme je voudrais (ajouter 0.5f à X, Y, Z et W). C'est ma faute: j'ai oublié de définir l'opérateur d'addition dans ma classe Point4.

    Ce que je ne comprends pas:
    * Il ne râle pas à la compilation !
    * Pire: Il me transforme mon " + 0.5f" par "+ Point4<float>(0.5f)" à la compilation/exécution. En effet, j'ai pu voir en debug qu'il appel le constructeur de Point4<float> avec 0.5f. Comment ose t-il appeler un constructeur sans que je lui demande ? Je trouve cela très perturbant.
    Y a-t-il moyen d'empêcher cela ? Comment s'appel cette façon de faire du compileur afin de trouver plus d'info sur Internet ?

    Merci d'avance.

    EDIT: Oups, je voulais mettre mon message dans le forum consacré au langage C++ et pas dans Visual c++ que je n'utilise pas.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Le compilateur ne s'autorise jamais rien. S'il le fait, c'est que vous, directement ou indirectement, lui avez indiqué de le faire.
    Vous auriez peut-être négligemment oublié de nous faire par d'un opérateur de cast implicite, non ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut
    J'ai volontairement supprimé les opérateurs de multiplication et division ainsi que les fonctions de ma classe Point4. J'ai aussi ces opérateurs (il ne passe pas dedans quand je suis en debug):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool operator ==(const Point4<T> &) const;
    bool operator !=(const Point4<T> &) const;
    bool operator <(const Point4<T> &) const;
     
    T& operator [](int i);
    const T& operator [](int i) const;
     
    operator T*();
    operator const T*() const;
    Voici ce qui se passe quand je suis en debug step by step:
    1) Appel du constructeur pour créé un point à partir de +0.5f
    2) Appel du constructeur pour créé le point 0.0, 0.0, -0.2, 1.0
    3) Multiplication des deux matrices (light projection & light view)
    4) Multiplication de la matrice de l'étape 3 par le point 0.0, 0.0, -0.2, 1.0
    5) Division par 2.0f de mon point calculé à l'étape 4
    6) Addition de 0.5f entre mon point de l'étape 5 et celui de l'étape 1

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Je n'avais pas vu les paramètres optionnels du constructeur.

    Et le comportement est donc maintenant, pour moi, tout à fait naturel.
    Si le comportement ne vous convient pas, redéfinissez l'opérateur + avec un float.

Discussions similaires

  1. Appel explicite du constructeur de recopie ?
    Par sebkramm dans le forum C++
    Réponses: 6
    Dernier message: 21/11/2007, 10h02
  2. Générer constructeur automatiquement ?
    Par nesbla dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 14/03/2007, 09h59
  3. Appel d'un constructeur à partir d'un autre
    Par Pragmateek dans le forum Langage
    Réponses: 28
    Dernier message: 18/06/2006, 01h07
  4. Réponses: 5
    Dernier message: 29/04/2006, 21h41
  5. Appel recursif au constructeur
    Par Math75 dans le forum C++
    Réponses: 1
    Dernier message: 11/10/2005, 15h48

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