C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

union et constructeur
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Fred
Guest





PostPosted: Thu Sep 04, 2003 5:32 pm    Post subject: union et constructeur Reply with 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...

Fred


Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Sep 04, 2003 6:15 pm    Post subject: Re: union et constructeur Reply with quote



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





PostPosted: Thu Sep 04, 2003 6:23 pm    Post subject: Re: union et constructeur Reply with quote



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





PostPosted: Thu Sep 04, 2003 6:35 pm    Post subject: Re: union et constructeur Reply with quote


"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





PostPosted: Thu Sep 04, 2003 8:36 pm    Post subject: Re: union et constructeur Reply with quote

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





PostPosted: Thu Sep 04, 2003 9:32 pm    Post subject: Re: union et constructeur Reply with quote

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.Cool, a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12.Cool 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





PostPosted: Thu Sep 04, 2003 10:00 pm    Post subject: Re: union et constructeur Reply with quote

"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





PostPosted: Fri Sep 05, 2003 5:26 am    Post subject: Re: union et constructeur Reply with quote

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.Cool, a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12.Cool 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





PostPosted: Fri Sep 05, 2003 6:58 am    Post subject: Re: union et constructeur Reply with quote

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





PostPosted: Fri Sep 05, 2003 7:25 am    Post subject: Re: union et constructeur Reply with quote


"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

Quote:
julien




Back to top
Fred
Guest





PostPosted: Fri Sep 05, 2003 7:40 am    Post subject: Re: union et constructeur Reply with quote


"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





PostPosted: Fri Sep 05, 2003 7:45 am    Post subject: Re: union et constructeur Reply with quote


"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.Cool, a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12.Cool 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





PostPosted: Fri Sep 05, 2003 10:37 am    Post subject: Re: union et constructeur Reply with 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...
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





PostPosted: Fri Sep 05, 2003 10:53 am    Post subject: Re: union et constructeur Reply with quote

"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





PostPosted: Fri Sep 05, 2003 12:07 pm    Post subject: Re: union et constructeur Reply with quote

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.Cool, a nontrivial destructor (12.4),
or a nontrivial copy assignment operator (13.5.3, 12.Cool 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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.