OVH Cloud OVH Cloud

union et constructeur

15 réponses
Avatar
Fred
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

10 réponses

1 2
Avatar
Fabien LE LEZ
On Thu, 4 Sep 2003 19:32:55 +0200, "Fred" 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.

Avatar
Michaël Cortex
Fabien LE LEZ wrote:
On Thu, 4 Sep 2003 19:32:55 +0200, "Fred" 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 -=>


Avatar
Fred
"Fabien LE LEZ" a écrit dans le message de news:

On Thu, 4 Sep 2003 19:32:55 +0200, "Fred" 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


Avatar
Fabien LE LEZ
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;
};
...
};

Avatar
Loïc Joly
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.8), a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12.8) 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

Avatar
Christophe Lephay
"Fabien LE LEZ" a écrit dans le message de
news:
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


Avatar
Julien Blanc
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.8), a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12.8) 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.

Avatar
Serge Paccalin
Le jeudi 4 septembre 2003 à 20:35, Fred a écrit dans fr.comp.lang.c++ :

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



Avatar
Fred
"Juliien Blanc" a écrit dans le message de news:
bj83ko$nbc$
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.

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

julien




Avatar
Fred
"Samuel Krempp" a écrit dans le message de
news: 3f57cc24$0$16166$
le Jeudi 4 Septembre 2003 20:35, é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)

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.


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...

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.

--
Sam
Enlever les mots en trop dans mon e-mail pour répondre



1 2