 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Fred Guest
|
Posted: Thu Sep 04, 2003 5:32 pm Post subject: union et constructeur |
|
|
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
}
Mon compilateur rejette une telle definition car Vector3f et Vector4f ont
des "copy constructor".
Je ne comprends pas (encore:-) pourquoi...
Fred
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Sep 04, 2003 6:15 pm Post subject: Re: union et constructeur |
|
|
On Thu, 4 Sep 2003 19:32:55 +0200, "Fred" <no.spam (AT) spam (DOT) no> wrote:
| Quote: | je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
|
Franchement, c'est une assez mauvaise idée en général, sauf si tu es
vraiment limité en place.
L'écriture
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
t'offrira autant de fonctionnalités et nettement moins de difficultés,
au coût d'une taille d'objet plus importante.
|
|
| Back to top |
|
 |
Michaël Cortex Guest
|
Posted: Thu Sep 04, 2003 6:23 pm Post subject: Re: union et constructeur |
|
|
Fabien LE LEZ wrote:
| Quote: | On Thu, 4 Sep 2003 19:32:55 +0200, "Fred" <no.spam (AT) spam (DOT) no> wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
Franchement, c'est une assez mauvaise idée en général, sauf si tu es
vraiment limité en place.
L'écriture
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
|
Euh... Je suppose que tu voulais dire ça :
class Variant {
Vector3f v3f;
Vector4f v4f;
;-)
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
Fred Guest
|
Posted: Thu Sep 04, 2003 6:35 pm Post subject: Re: union et constructeur |
|
|
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message de news:
[email]g70flv4lr4aulc7jd7qsm7gcds2003o0c2 (AT) 4ax (DOT) com[/email]...
| Quote: | On Thu, 4 Sep 2003 19:32:55 +0200, "Fred" <no.spam (AT) spam (DOT) no> wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
Franchement, c'est une assez mauvaise idée en général, sauf si tu es
vraiment limité en place.
L'écriture
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
t'offrira autant de fonctionnalités et nettement moins de difficultés,
au coût d'une taille d'objet plus importante.
|
En fait, l'union devrait comporter plus de variables (je n'ai qu'un exemple
pour donner une idee)
Mon probleme est que je ne comprends pas pourquoi un constructeur par copie
empeche ma classe d'apparaitre dans une union.
Fred
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Sep 04, 2003 8:36 pm Post subject: Re: union et constructeur |
|
|
On Thu, 04 Sep 2003 18:23:25 GMT, "Michaël Cortex" <cort (AT) meloo (DOT) com>
wrote:
| Quote: | Euh... Je suppose que tu voulais dire ça :
class Variant {
Vector3f v3f;
Vector4f v4f;
|
Si l'union était le seul élément de la classe, oui (mais dans ce cas
je ne vois pas pourquoi faire une classe).
En fait je voulais dire
class Variant
{
struct ...
{
Vector3f v3f;
Vector4f v4f;
};
...
};
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Sep 04, 2003 9:32 pm Post subject: Re: union et constructeur |
|
|
Fred wrote:
| Quote: | je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
}
Mon compilateur rejette une telle definition car Vector3f et Vector4f ont
des "copy constructor".
Je ne comprends pas (encore:-) pourquoi...
|
Parce que c'est interdit dans le standard.
9.5 Unions
[...]
An object of a class with a nontrivial constructor (12.1), a nontrivial
copy constructor (12. , a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12. cannot be a member of a union,
or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le
compilateur d'appeller les bonnes fonction :
union U
{
A a;
B b;
C c;
};
void (f)
{
U u;
if (b) // b étant une variable tappée au clavier par l'utilisateur
{
u.a = ...
}
else
{
u.b = ...
}
// 100000 lignes de code
u.c = ...
// Ici, le compilateur doit appeler le destructeur de A ou celui de B
en fonction de ce que l'utilisateur a tappé au clavier...
}
--
Loïc
|
|
| Back to top |
|
 |
Christophe Lephay Guest
|
Posted: Thu Sep 04, 2003 10:00 pm Post subject: Re: union et constructeur |
|
|
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message de
news:0g8flvkd6tud3a1utl85hs4m0iouf6cg40 (AT) 4ax (DOT) com...
| Quote: | On Thu, 04 Sep 2003 18:23:25 GMT, "Michaël Cortex"
wrote:
Euh... Je suppose que tu voulais dire ça :
class Variant {
Vector3f v3f;
Vector4f v4f;
Si l'union était le seul élément de la classe, oui (mais dans ce cas
je ne vois pas pourquoi faire une classe).
En fait je voulais dire
class Variant
{
struct ...
{
Vector3f v3f;
Vector4f v4f;
};
...
};
|
Personnellement, je pencherais plutôt pour un truc du genre :
class Vectorf
{
....
};
class Vector3f : public Vectorf
{
....
};
class Vector4f : public Vectorf
{
....
};
class Variant
{
Vectorf * some_vector;
....
};
Chris
|
|
| Back to top |
|
 |
Julien Blanc Guest
|
Posted: Fri Sep 05, 2003 5:26 am Post subject: Re: union et constructeur |
|
|
Loïc Joly wrote:
| Quote: | Parce que c'est interdit dans le standard.
9.5 Unions
[...]
An object of a class with a nontrivial constructor (12.1), a nontrivial
copy constructor (12. , a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12. cannot be a member of a union,
or can an array of such objects.
|
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition
précise à ce sujet ?
--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.
|
|
| Back to top |
|
 |
Serge Paccalin Guest
|
Posted: Fri Sep 05, 2003 6:58 am Post subject: Re: union et constructeur |
|
|
Le jeudi 4 septembre 2003 à 20:35, Fred a écrit dans fr.comp.lang.c++ :
| Quote: | je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
Mon probleme est que je ne comprends pas pourquoi un constructeur par copie
empeche ma classe d'apparaitre dans une union.
|
Quand il faudra copier un Variant dans un autre, lequel des deux membres
v3f et v4f faudra-t-il copier ?
--
___________ 2003-09-05 08:56:55
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763
|
|
| Back to top |
|
 |
Fred Guest
|
Posted: Fri Sep 05, 2003 7:25 am Post subject: Re: union et constructeur |
|
|
"Juliien Blanc" <julien.blanc (AT) laposte (DOT) net> a écrit dans le message de news:
bj83ko$nbc$1 (AT) news-reader3 (DOT) wanadoo.fr...
| Quote: | Fred wrote:
En fait, l'union devrait comporter plus de variables (je n'ai qu'un
exemple
pour donner une idee)
Mon probleme est que je ne comprends pas pourquoi un constructeur par
copie
empeche ma classe d'apparaitre dans une union.
est-ce que
class {
Vector3f v3f;
Vector4f v4f;
}
fonctionne ? (et d'ailleurs est-ce que Vector3f v3f fonctionne ??? )
Le fait d'avoir un constructeur par copie défini fait que le
constructeur par défaut n'est pas défini par le compilateur, et que tu
dois le définir toi-même. Ca peut expliquer...
|
non, meme avec un constructeur par defaut, il veut pas.
| Quote: | sinon, donne au moins le message d'erreur que te renvoie ton
compilateur. A priori, il n'y a pas de raisons que ça ne fonctionne pas
(j'ai déjà utilisé des unions à l'intérieur de classes et il ne me
semble pas avoir eu ce problème).
|
error C2621: union '__unnamed' : member 'Vector3f' has copy constructor
|
|
| Back to top |
|
 |
Fred Guest
|
Posted: Fri Sep 05, 2003 7:40 am Post subject: Re: union et constructeur |
|
|
"Samuel Krempp" <krempp (AT) crans (DOT) trucs.en.trop.org> a écrit dans le message de
news: 3f57cc24$0$16166$626a54ce (AT) news (DOT) free.fr...
| Quote: | le Jeudi 4 Septembre 2003 20:35, [email]no.spam (AT) spam (DOT) no[/email] écrivit :
En fait, l'union devrait comporter plus de variables (je n'ai qu'un
exemple pour donner une idee)
Mon probleme est que je ne comprends pas pourquoi un constructeur par
copie empeche ma classe d'apparaitre dans une union.
parcequ'il est assez difficile d'imaginer un comportoment à la fois
cohérent
et utile à une telle chose.
Qd une classe a des cteurs non triviaux, on peut s'attendre à ce que telle
configuration de la zone mémoire de l'objet (et elle seule) ne suffise pas
à assurer sa validité. (ie : il utilise des pointeurs vers autre chose,
etc..)
|
ben dans mon cas, j'ai
class Vector3f {
public:
Vector3f(const Vector3f& v);
~Vector3f();
// et quelques operateurs = + - == * /
protected
float x,y,z;
};
et la configuration de la zone mémoire de l'objet (et elle seule) suffi à
assurer sa validité (enfin, je crois)
| Quote: | C'est pour ça que la classe fournit des cteurs et/ou dteurs.
Dans ces cas là, il est nécessaire de savoir ce qu'il faut faire pour
copier, puis détruire cette union, et ça dépendra de quel type parmi
l'union on a instancié un objet (en imaginant même qu'on est arrivé à
instancier un objet de cette union contre-nature..)
|
je m'etais dit que les constructeurs / destructeurs de la classes contenant
l'union permettraient de determiner les actions a executer.
| Quote: |
Bref, les union, c'est pour les 'plain old data' (POD), ça se transpose
pas
vraiment aux objets à cteurs | dteurs non triviaux.
|
J'ai vu cela par ci par la... Mais le pourquoi m'echape un peu...
| Quote: | l'héritage est à priori plus adapté, pour des classes non-POD.
enfin, ça dépend, à quoi était destinée cette 'union' ?
|
je dois donc revoir ma hierarchie de classes. OK, merci.
| Quote: | --
Sam
Enlever les mots en trop dans mon e-mail pour répondre
|
|
|
| Back to top |
|
 |
Fred Guest
|
Posted: Fri Sep 05, 2003 7:45 am Post subject: Re: union et constructeur |
|
|
"Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> a écrit dans le message de news:
bj8au2$7vv$1 (AT) news-reader2 (DOT) wanadoo.fr...
| Quote: | Fred wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
}
Mon compilateur rejette une telle definition car Vector3f et Vector4f
ont
des "copy constructor".
Je ne comprends pas (encore:-) pourquoi...
Parce que c'est interdit dans le standard.
9.5 Unions
[...]
An object of a class with a nontrivial constructor (12.1), a nontrivial
copy constructor (12. , a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12. cannot be a member of a union,
or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le
compilateur d'appeller les bonnes fonction :
union U
{
A a;
B b;
C c;
};
void (f)
{
U u;
if (b) // b étant une variable tappée au clavier par l'utilisateur
{
u.a = ...
}
else
{
u.b = ...
}
// 100000 lignes de code
u.c = ...
// Ici, le compilateur doit appeler le destructeur de A ou celui de B
en fonction de ce que l'utilisateur a tappé au clavier...
}
|
C'est un bon exemple, ca aide a comprendre.
Mais si aucun des destructeurs n'est defini (c'est a dire que l'on se
contente du destructeur par defaut) cela ne semblerait pas poser trop de
problemes.
Merci
|
|
| Back to top |
|
 |
Christophe Lephay Guest
|
Posted: Fri Sep 05, 2003 10:37 am Post subject: Re: union et constructeur |
|
|
"Julien Blanc" <Julien.Blanc (AT) imag (DOT) fr> a écrit dans le message de
news:3f581e72$0$26406$626a54ce (AT) news (DOT) free.fr...
| Quote: | qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition
précise à ce sujet ?
|
Un constructeur trivial est un constructeur qui n'utilise que des
constructeurs triviaux pour initialiser ses membres ;)
Sérieusement, je ne sais plus quelle est la définition. Les constructeurs
que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas
sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial
non plus...
Je dirais qu'un constructeur trivial est un constructeur qui ne comporte
qu'une liste d'initialisation, avec un corps vide, mais vu tout ce qu'on
peut faire dans la liste d'initialisation, il se peut que cette définition
ne soit pas exacte...
Chris
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Fri Sep 05, 2003 10:53 am Post subject: Re: union et constructeur |
|
|
"Christophe Lephay" <christophe-lephay (AT) wanadoo (DOT) fr> writes:
| Quote: | "Julien Blanc" <Julien.Blanc (AT) imag (DOT) fr> a écrit dans le message de
news:3f581e72$0$26406$626a54ce (AT) news (DOT) free.fr...
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition
précise à ce sujet ?
|
Yep.
| Quote: | Sérieusement, je ne sais plus quelle est la définition. Les constructeurs
que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas
sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial
non plus...
|
si le constructeur est defini par l'utilisateur, alors il n'est pas
trivial. Par définition. :-)
12.1/5
[...] A constructor is trivial if it is an implicitly-declared
default constructor and if:
-- its class has no virtual functions (10.3) and no virtual base
classes (10.1), and
-- all the direct base classes of its class have trivial
constructors, and
-- for all the nonstatic data members of its class that are of class
type (or array thereof), each such class has a trivial
constructor.
12.1/6
Otherwise, the constructor is non-trivial.
-- Gaby
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Sep 05, 2003 12:07 pm Post subject: Re: union et constructeur |
|
|
Julien Blanc <Julien.Blanc (AT) imag (DOT) fr> wrote
| Quote: | Loïc Joly wrote:
Parce que c'est interdit dans le standard.
9.5 Unions
[...]
An object of a class with a nontrivial constructor (12.1), a
nontrivial copy constructor (12. , a nontrivial destructor (12.4),
or a nontrivial copy assignment operator (13.5.3, 12. cannot be a
member of a union, or can an array of such objects.
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une
définition précise à ce sujet ?
|
Oui. Intuitivement, c'est une fonction sans code, ou dans le cas des
copy, une copie bit-à-bit. Formellement, la fonction est trivielle si
elle n'est pas declarée par le programmeur, et que la classe n'a pas de
fonctions virtuelles, ni de bases virtuelles, et que la même fonction
est trivielle dans toutes les classes de base et tous les variables
non-statiques membres. (En gros. En fait, un destructeur peut être
trivial même si la classe a des fonctions vituelles ou des bases
virtuelles.)
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|