Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > Visual C++ > C++/CLI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/10/2012, 21h42   #1
zenux
Membre régulier
 
Inscription : février 2006
Messages : 336
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 336
Points : 79
Points : 79
Par défaut Appel d'un constructeur automatiquement

Bonjour,

J'ai une classe Point4 qui ressemble à ceci:
Code :
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 :
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.
zenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2012, 14h14   #2
bacelar
Expert Confirmé Sénior
 
Homme Paul Bacelar
Développeur informatique
Inscription : février 2005
Messages : 2 651
Détails du profil
Informations personnelles :
Nom : Homme Paul Bacelar
Âge : 41
Localisation : France

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

Informations forums :
Inscription : février 2005
Messages : 2 651
Points : 4 044
Points : 4 044
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 ?
bacelar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2012, 22h20   #3
zenux
Membre régulier
 
Inscription : février 2006
Messages : 336
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 336
Points : 79
Points : 79
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 :
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
zenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2012, 06h43   #4
bacelar
Expert Confirmé Sénior
 
Homme Paul Bacelar
Développeur informatique
Inscription : février 2005
Messages : 2 651
Détails du profil
Informations personnelles :
Nom : Homme Paul Bacelar
Âge : 41
Localisation : France

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

Informations forums :
Inscription : février 2005
Messages : 2 651
Points : 4 044
Points : 4 044
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.
bacelar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h49.


 
 
 
 
Partenaires

Hébergement Web