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 �clair�
    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
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    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 �clair�
    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
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    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 Invit� 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