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

5 réponses

1 2
Avatar
Fred
"Loïc Joly" a écrit dans le message de news:
bj8au2$7vv$
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...
}



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


Avatar
Christophe Lephay
"Julien Blanc" a écrit dans le message de
news:3f581e72$0$26406$
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

Avatar
Gabriel Dos Reis
--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

"Christophe Lephay" writes:

| "Julien Blanc" a écrit dans le message de
| news:3f581e72$0$26406$
| > qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition
| > précise à ce sujet ?

Yep.

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

--=-=- Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable


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

--=-=-=--
Avatar
kanze
Julien Blanc wrote in message
news:<3f581e72$0$26406$...
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 ?


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


Avatar
kanze
"Fred" wrote in message
news:<bj9f28$jd9$...
"Loïc Joly" a écrit dans le message de
news: bj8au2$7vv$
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...
}


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.


Il a parlé des destructeurs à titre d'exemple. Comment faire pour
construire l'union, si un ou plusieurs membres ont un constructeur par
défaut non trivial ? Comment faire pour la copier si un ou plusieurs
membres ont un constructeur de copie non trivial ? Comment faire pour
l'affecter si un ou plusieurs membres on un opérateur d'affectation non
trivial ?

Si tu régardes les définitions des constructeurs et al. trivaux, tu
verras qu'elles correspondent très exactement à ce qu'on peut faire avec
un no-op, ou dans les cas des copies, avec memcpy. Sans en savoir plus
sur le contenu.

--
James Kanze GABI Software mailto:
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



1 2