Appel d'un constructeur dans un constructeur via placement new [C++] - C++ - Programmation
Marsh Posté le 18-09-2003 à 18:20:23
Code :
|
?
Code :
|
Marsh Posté le 18-09-2003 à 18:24:29
Code :
|
c'est que j'ai essayé au tout début mé y veux pas
sinon comme tu vois je me remets à 3DSMax
Marsh Posté le 18-09-2003 à 18:27:27
BJOne a écrit : [cpp] |
qu'est ce que tu nous prepare de beau ?
Marsh Posté le 18-09-2003 à 18:28:48
chrisbk a écrit : |
un truc qui marche déjà ce serait un bon début
(au fur et à mesure que je fais mumuse avec des modèles, je fais: ho là ça mairde à l'export, méporquédidoncça ?)
Marsh Posté le 18-09-2003 à 18:32:07
BJOne a écrit : |
fais comme moi : delegue
des idées a partager ? Tu comptes implanter quoi comme fitures ? un screenshot ?
(on (enfin, le collegue ) a tout refait les mater max. Je dis ca paske visiblement t'as les pieds dedans, amuse toi bien )
Marsh Posté le 18-09-2003 à 18:34:45
oulà je paufine l'export texture (avec toutes les conneries de Crop & co que j'avais pas vu avant....)
pi après dans la liste des truc à faire, c'est avoir du bump qui marche
Marsh Posté le 18-09-2003 à 18:35:39
Tu mets le code de ton constructeur par defaut dans une fonction membre et tu l'appelles si besoin.
Marsh Posté le 18-09-2003 à 18:36:36
BJOne a écrit : oulà je paufine l'export texture (avec toutes les conneries de Crop & co que j'avais pas vu avant....) |
ben si tu trouves un truc qui explique comment calculer les vecteurs tangents ca serait sympa
Tout ce que je trouve c'est des "bah utilise D3DXMachinTruc"
super
Marsh Posté le 18-09-2003 à 18:37:51
Kristoph a écrit : Tu mets le code de ton constructeur par defaut dans une fonction membre et tu l'appelles si besoin. |
ouais, c'est ce que je comptais faire au final, mais à titre intellectuel, j'aimerais savoir, si dans le cas ou y'aurais à appeller un constructeur dans un autre, le placement new est ce qu'il y a de plus adapté....
Marsh Posté le 18-09-2003 à 18:38:54
chrisbk a écrit : |
j'ai vu ça, mais comme je suis pas à ce stade, j'en sais pas trop plus...
Marsh Posté le 18-09-2003 à 18:43:10
BJOne a écrit : |
Je pense que c'est très douteux quand même. Surtout au niveau de l'appel aux constructeurs des classes parentes.
Marsh Posté le 18-09-2003 à 18:46:45
ton truc est suicidaire au sens littéral. le C++ n'est pas Java et ne propose pas de définir un constructeur en fonction d'un autre .|
quant à ZeroMemory( &Mat, sizeof( BML_Material ) ); , y a des grandes chances que y est des flottant dans ta matrice et la représentation binaire 0x00000000 est invalide et en tous les cas != 0.0
Marsh Posté le 18-09-2003 à 18:46:52
Kristoph a écrit : |
à oui ça c'est effectivement à éviter....
mais du moment qu'on appelle un constructeur du "même niveau" ??
Marsh Posté le 18-09-2003 à 18:48:17
dons plusieurs solution :
1) plusieurs constructeurs avec des arguments pas défaut
2) des fabriques statiques
Marsh Posté le 18-09-2003 à 18:49:58
Taz a écrit : ton truc est suicidaire au sens littéral. le C++ n'est pas Java et ne propose pas de définir un constructeur en fonction d'un autre .| |
t'inquiètes pas c'est pas une matrice (Mat:matériaux)...
la seule matrice c'est uvMatrix, elle mise à I dans le premier constructeur.
de toutes façon, je vais passer par une méthode qui réinitialise les membres de l'instance, comme ça je reparts d'un truc sain entre plusieurs GetFromMax (chose qui ne devrait jamais arriver en fait, mais ça sera mieux à tous les étages)
Marsh Posté le 18-09-2003 à 18:55:05
le problème est double:
1) la mémoire allouée pour this ne t'appartient pas
2) avec ton écriture, this est déjà construit et intègre, et en reconstuisant dessus, tu provoques sans doute des fuites de mémoires et autres effets indésirables, puisqu'aucun destructeur n'est appelé, etc...
et c'est très crade, j'ai encore tout un tas de bonnes raisons, mais je suis sur que tu vas être capable de résoudre ça bien. ton problème est compréhensible, mais ton volume de code est minime, dans le cas contraire : - fais une fonction membre privée Init(), - si beaucoup de paramètres au constructeur, on peut facilement faire une facilité pour avoir un comportement comme avec des paramètres nommés
Marsh Posté le 18-09-2003 à 19:01:12
Taz a écrit : le problème est double: |
attention y'a normalement pas de double construction/allocation avec le placement new...
Marsh Posté le 18-09-2003 à 19:25:49
toi t'as pas l'air de voir que l'allocation et la construction sont 2 choses bien distinctes ? il y a effectivement double construction
Marsh Posté le 18-09-2003 à 19:35:26
Taz a écrit : toi t'as pas l'air de voir que l'allocation et la construction sont 2 choses bien distinctes ? il y a effectivement double construction |
je suis d'accord, en fait je m'explique mal (je crois que l'on est d'accord au final)
Marsh Posté le 18-09-2003 à 19:36:08
ReplyMarsh Posté le 18-09-2003 à 19:46:19
en fait si l'on fait ça:
class T;
T *ptr= new T;
---
delete ptr;
-----------
c'est équivalent à:
ptr = alloc_quelquonque(sizeof(T));
new (ptr) T;
----
ptr->~T();
libere_quelquonque(ptr);
si l'on se limite à ce contexte ok...
---------------------------
donc avoir:
class T
{
public:
T()
{
.... pleins de trucs ....
}
T( machin param )
{
new (this) T;
truc_fait_avec(param);
}
}
fera que le code de T() sera appellé dans T( machin param ), mais l'allocation mémoire est faite avant, this pointant sur l'espace mémoire alloué. d'un point de vue lecture on a double construction, mais si les constructions se complémentent sans "répétition", on conserve la cohérence (pas de fuite mémoire, construction/destruction symétrique en cas de pointeurs)...
Marsh Posté le 18-09-2003 à 19:47:56
Taz a écrit : alors tu fais quoi comme solution ? |
je suis passé par une méthode Clear ou (Init comme tu veux), de toutes façon il fallait absolument que mes ClipU & co soient initialisés pour GetFromMax....
en fait le but c'était d'avoir quelques discussion autour du placement new dans ce cas là
Marsh Posté le 18-09-2003 à 19:49:13
ben non, y a fuite de mémoire à tous les coups. mais une string ou un vector dedans, et reviens m'en parlé, tu verras.
je désapprouve complètement cette construction
Marsh Posté le 18-09-2003 à 19:50:05
ptr = alloc_quelquonque(sizeof(T));
new (ptr) T;
----
ptr->~T();
libere_quelquonque(ptr);
qui est très laid
Marsh Posté le 18-09-2003 à 19:50:35
Taz a écrit : ben non, y a fuite de mémoire à tous les coups. mais une string ou un vector dedans, et reviens m'en parlé, tu verras. |
a ouais, là je vois mieux effectivement, y'a double construction pour les objets membres.
oki là je suis te suis
Marsh Posté le 18-09-2003 à 19:52:08
Taz a écrit : ptr = alloc_quelquonque(sizeof(T)); |
c'est pas faux... mais c'est une écriture possible
Marsh Posté le 18-09-2003 à 18:18:37
Bijour, je pense que celle-là elle est pour taz:
donc voici un bout de classe:
je voulais si il existait un autre moyen d'appeller (autre que via le placement new) le constructeur MaterialDescription (sans paramètres) dans le constructeur MaterialDescription( StdMat *Sm, TimeValue Tm ).
désolé si je poses une question bête (il en fo bien de temps en temps)
paske:
compile, mes les Clip,uvMatrix & co ne sont pas initialisés....
(or VC 7.1 bug ?)
Message édité par bjone le 18-09-2003 à 18:19:59