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 

vector<objet_perso> 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
Nicolas Aunai
Guest





PostPosted: Sat Feb 07, 2004 11:07 am    Post subject: vector<objet_perso> et constructeur Reply with quote



salut,


j'ai une classe Objet, et une classe TabObjet qui contient un
vector<Objet>

chaque Objet à pour membre :

un unsigned int ID, que le caractérise facilement.
un string Name, sorte d'id mais pour l'utilisateur.

et quelques autres paramètres pas très importants...

bref, le constructeur de Objet demande entre autre, l'ID et le Name, et
le constructeur par défaut lui, fixe un ID qui est égal à
l'incrémentation de un, d'une vairable statique initialisée a 0, ainsi
qu'un Name par défaut.

Objet::Objet()
:Name("SansNom"),ID(nb++) //avec static unsigned int nb = 0; dans la
classe
{
}

alors là, ça va bien lorsque j'appelle le constructeur "manuellement",
cependant je ne comprends pas ce qui se passe lorsque j'apelle le
constructeur de TabObjet.

TabObjet::TabObjet():mon_tab(100)
{
}

va créer un vector de 100 Objet, mais comment ceux-ci vont-ils être
crées ? par le constructeur par défaut ?

je me demande en fait, si les Objet de mon vector auront bien des bons
ID


merci d'avance pour les explications !!!

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]

Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Feb 07, 2004 11:30 am    Post subject: Re: vector<objet_perso> et constructeur Reply with quote



On Sat, 07 Feb 2004 12:07:49 +0100, Nicolas Aunai
<nicolas.aunai (AT) free (DOT) fr> wrote:

Quote:
TabObjet::TabObjet():mon_tab(100)
{
}

va créer un vector de 100 Objet, mais comment ceux-ci vont-ils être
crées ? par le constructeur par défaut ?

Si je ne m'abuse, tu appelles ainsi le constructeur suivant :
std::vector<>::vector<> (size_t nombre, Objet const& o= Objet())

Donc, le constructeur de Objet est appelé une fois, et ensuite les 100
objets contenus dans le vector<> sont créés en appelant le
constructeur de copie Objet::Objet (Objet const&)

Si j'ai tout bien suivi, tu crées ainsi un vector<> de 100 objets
parfaitement indentiques.

Le code suivant, par contre, fonctionnera comme tu veux :

TabObjet::TabObjet()
{
static int NB_OBJETS= 100; // D'où sort ce nombre, au fait ?
for (int i=0; i {
mon_tab.push_back (Objet());/* Rajoute ici un commentaire pour
bien mettre en valeur que les objets créés ont des ID différents */
}
}


--
;-)

Back to top
Nicolas Aunai
Guest





PostPosted: Sat Feb 07, 2004 11:42 am    Post subject: Re: vector<objet_perso> et constructeur Reply with quote



Fabien LE LEZ a écrit :



Quote:
Le code suivant, par contre, fonctionnera comme tu veux :

TabObjet::TabObjet()
{
static int NB_OBJETS= 100; // D'où sort ce nombre, au fait ?
for (int i=0; i {
mon_tab.push_back (Objet());/* Rajoute ici un commentaire pour
bien mettre en valeur que les objets créés ont des ID différents */
}
}



ah ok d'accord, 100 c'était pour l'exemple, le constructeur TabObjet
par défaut prendra un nombre d'Objet par défaut, par exemple 10, et il
y aura bien sûr un constructeur surchargé prenant un nombre d'Objet a
stocker.

en fait Objet est un objet Particule, et TabObjet représente un tableau
de Particules, chaque particule à un ID facilitant le calcul de la
resultante des forces conséquence de l'intéraction avec les n-1 autres
particules du tableau.

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Feb 07, 2004 3:23 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

On Sat, 07 Feb 2004 12:42:35 +0100, Nicolas Aunai
<nicolas.aunai (AT) free (DOT) fr> wrote:

Quote:
en fait Objet est un objet Particule, et TabObjet représente un tableau
de Particules, chaque particule à un ID facilitant le calcul de la
resultante des forces conséquence de l'intéraction avec les n-1 autres
particules du tableau.

L'index dans le tableau ne suffit-il pas ?

--
;-)

Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Feb 07, 2004 3:31 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

On Sat, 07 Feb 2004 12:42:35 +0100, Nicolas Aunai
<nicolas.aunai (AT) free (DOT) fr> wrote:

Quote:
en fait Objet est un objet Particule, et TabObjet représente un tableau
de Particules, chaque particule à un ID facilitant le calcul de la
resultante des forces conséquence de l'intéraction avec les n-1 autres
particules du tableau.

Je viens de voir ton post sur fca, et franchement, je n'ai pas la
moindre idée de l'utilité de cet ID.

--
;-)

Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Feb 07, 2004 3:42 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

On Sat, 07 Feb 2004 16:31:11 +0100, Fabien LE LEZ
<gramster (AT) gramster (DOT) com> wrote:

Quote:
Je viens de voir ton post sur fca, et franchement, je n'ai pas la
moindre idée de l'utilité de cet ID.


Allez zou, un bout de code pour expliquer ma réaction :

void TabObjet::CalculeInteractions (Temps dt)
{
for (vector<Objet>::iterator i= mon_tab.begin();
i!=mon_tab.end(); ++i)
{
Vecteur acceleration= 0;
for (vector<Objet>::const_iterator j= mon_tab.begin();
j!=mon_tab.end(); ++j)
if (&*i != &*j)
{
Scalaire distance_au_carre=
CalculeDistanceAuCarre ((*i).position, (*j).position);
if (distance == 0)
{
throw "Collision entre " + (*i).nom + " et " + (*j).nom;
}
else
{
acceleration+= (*i).masse * (*j).masse
/ distance_au_carre;
}
}
(*i).vitesse+= acceleration * dt;
}
for (vector<Objet>::iterator i= mon_tab.begin();
i!=mon_tab.end(); ++i)
{
(*i).position+= (*i).vitesse * dt;
}
}

--
;-)

Back to top
Nicolas Aunai
Guest





PostPosted: Sat Feb 07, 2004 4:14 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

Fabien LE LEZ a exprimé avec précision :

Quote:
Je viens de voir ton post sur fca, et franchement, je n'ai pas la
moindre idée de l'utilité de cet ID.

bah, dans mon idée, l'ID me permet de garder une trace d'une particule
donnée, puisque chaque ID est unique. Ainsi, si dans les calculs
d'intéractions les indices de boucles suffisent a dicerner une
particule d'une autre, si à un moment donné je veux faire
systeme.suppr(un_ID) toutes les particules se trouvant "a droite" de
un_ID seront décalées, et grâce à leur ID j'aurai toujours une main
dessus pour leur appliquer je en sais quoi par la suite...

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Feb 07, 2004 4:35 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

On Sat, 07 Feb 2004 17:14:33 +0100, Nicolas Aunai
<nicolas.aunai (AT) free (DOT) fr> wrote:

Quote:
pour leur appliquer je en sais quoi par la suite...

Donc, en gros, tu cherches à mettre un ID sur tes objets, avec tous
les inconvénients et complications que ça apporte, sans trop savoir
pourquoi tu le fais ?

--
;-)

Back to top
Nicolas Aunai
Guest





PostPosted: Sat Feb 07, 2004 4:59 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

Fabien LE LEZ avait prétendu :


Quote:
Donc, en gros, tu cherches à mettre un ID sur tes objets, avec tous
les inconvénients et complications que ça apporte, sans trop savoir
pourquoi tu le fais ?


j'appelle ça prévoir... quelles complications ça apporte ? incrémenter
une variable statique a chaque construction, définir un membre ID, un
accesseur en lecture, un en écriture... et voila.

je le fais pour que les particules ne soient pas "anonymes", ça peut
toujours servir par la suite.

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Feb 07, 2004 5:39 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

On Sat, 07 Feb 2004 17:59:40 +0100, Nicolas Aunai
<nicolas.aunai (AT) free (DOT) fr> wrote:

Quote:
j'appelle ça prévoir...

Justement, il faut savoir se limiter dans ses prévisions, et se
contenter de ce qui apporte plus de fonctionnalités utiles que de
problèmes.

Quote:
quelles complications ça apporte ? incrémenter
une variable statique a chaque construction, définir un membre ID, un
accesseur en lecture, un en écriture... et voila.

Ce n'est pas si simple que ça (cf plus bas).

Quote:
je le fais pour que les particules ne soient pas "anonymes",

En gros, tu veux donner une sémantique d'identité (ou d'entité) à tes
objets. C'est un point de vue assez courant, mais loin d'être anodin.
Ta méthode est peut-être un bon début, mais n'est pas complète : tu
dois définir le constructeur par copie (et l'opérateur de copie qui
"va avec"), pour t'assurer que deux objets différents ne peuvent pas
avoir le même ID (le constructeur par copie généré par le compilateur
se contente de copier membre à membre, ce qui ne convient pas ici --
la preuve, ton erreur - qui a déclenché le présent thread - n'a pas
été repérée par le compilo). Une technique classique est d'interdire
l'usage du constructeur de copie et de l'opérateur =, en les déclarant
privés.
D'autre part, std::vector<> ne convient pas du tout, puisqu'il
n'accepte que des objets ayant une sémantique de valeur (il se permet
de copier allègrement les objets). Tu peux par contre utiliser un
vector<> de pointeurs -- et allouer tes objets dynamiquement, à la
main.

Bon, je fatigue, donc je m'en tiens à ces explications superficielles.
Et j'attends que les vrais spécialistes du C++ donnent leur avis sur
la question -- j'avoue que, n'ayant aucune expérience objet en-dehors
du C++, j'ai tendance à éviter au maximum d'utiliser des objets à
sémantique d'entité.
Mais tu as en tout cas raison sur un point : si tu as _vraiment_
besoin d'une sémantique d'entité, mets-la en place tout de suite, car
ça va modifier profondément ton programme.

--
;-)

Back to top
Nicolas Aunai
Guest





PostPosted: Sat Feb 07, 2004 5:51 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

Fabien LE LEZ a formulé la demande :

Quote:
Justement, il faut savoir se limiter dans ses prévisions, et se
contenter de ce qui apporte plus de fonctionnalités utiles que de
problèmes.

c'est justement parce que plus tard j'aurai peut-etre envie de faire
quelque chose a laquelle j'avais pas pensé avant que bâtir les bases
d'un programme de manière la plus "généraliste" possible me semble une
bonne idée, et ça implique donner une identité a mes particules. C'est
l'utilisation de bibliotheques c++ pour programmation graphique
evennementielle qui m'en a donné l'idée, dans ce genre de truc, chaque
composant d'un formulaire, un objet, est caractérisé par un ID, ce qui
permet de lui appliquer tout un tas de choses...


Quote:
En gros, tu veux donner une sémantique d'identité (ou d'entité) à tes
objets. C'est un point de vue assez courant, mais loin d'être anodin.
Ta méthode est peut-être un bon début, mais n'est pas complète : tu
dois définir le constructeur par copie (et l'opérateur de copie qui
"va avec"), pour t'assurer que deux objets différents ne peuvent pas
avoir le même ID (le constructeur par copie généré par le compilateur
se contente de copier membre à membre, ce qui ne convient pas ici --
la preuve, ton erreur - qui a déclenché le présent thread - n'a pas
été repérée par le compilo). Une technique classique est d'interdire
l'usage du constructeur de copie et de l'opérateur =, en les déclarant
privés.

mais c'est pas parce que j'en avais pas parlé que je l'avais pas fait
Smile mon constructeur par copie recopie membre a membre sauf l'ID qui est
toujours le nombre_de_particules++. quant à l'opérateur d'assignation
je l'ai mis en privé, mais il ne fait rien.


Quote:
D'autre part, std::vector<> ne convient pas du tout, puisqu'il
n'accepte que des objets ayant une sémantique de valeur (il se permet
de copier allègrement les objets).


alors là... j'y pensais pas.


Quote:
Tu peux par contre utiliser un
vector<> de pointeurs -- et allouer tes objets dynamiquement, à la
main.

commet ça ? qu'est-ce que ça change... je piges pas bien

Quote:
Bon, je fatigue, donc je m'en tiens à ces explications superficielles.
Et j'attends que les vrais spécialistes du C++ donnent leur avis sur
la question -- j'avoue que, n'ayant aucune expérience objet en-dehors
du C++, j'ai tendance à éviter au maximum d'utiliser des objets à
sémantique d'entité.
Mais tu as en tout cas raison sur un point : si tu as _vraiment_
besoin d'une sémantique d'entité, mets-la en place tout de suite, car
ça va modifier profondément ton programme.


merci des explications, je sais pas si j'en ai besoin, c'est une
manière évidente est simple que j'ai trouvé non seulement pour ne pas
perdre mes particules, mais aussi pour les trier facilement par
exemple.

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Nicolas Aunai
Guest





PostPosted: Sat Feb 07, 2004 6:00 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

Quote:
Tu peux par contre utiliser un
vector<> de pointeurs -- et allouer tes objets dynamiquement, à la
main.

commet ça ? qu'est-ce que ça change... je piges pas bien




vector<*Objet> tab;

Objet::Objet()
{
for(unsigned int i=0; i tab.push_back(new Objet);
}


??

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Loïc Joly
Guest





PostPosted: Sun Feb 08, 2004 1:32 am    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

Fabien LE LEZ wrote:
Quote:
On Sat, 07 Feb 2004 17:59:40 +0100, Nicolas Aunai
[email]nicolas.aunai (AT) free (DOT) fr[/email]> wrote:
[...]
quelles complications ça apporte ? incrémenter
une variable statique a chaque construction, définir un membre ID, un
accesseur en lecture, un en écriture... et voila.
[...]
je le fais pour que les particules ne soient pas "anonymes",


En gros, tu veux donner une sémantique d'identité (ou d'entité) à tes
objets. C'est un point de vue assez courant, mais loin d'être anodin.
Ta méthode est peut-être un bon début,
[...]


En C++, si je veux donner une sémentique d'identité, j'utilises plutôt
des pointeurs, l'adresse servant alors d'identifiant unique. Le seul
intérêt que je peux voir à dupliquer ça avec un champ id est si on veux
s'interfacer avec des gens qui ne peuvent avoir accès directement à nos
objet (autres process sur une autre machine, interfaçage avec une
bibliothèque SQL,...).

--
Loïc

Back to top
Loïc Joly
Guest





PostPosted: Sun Feb 08, 2004 1:34 am    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

Nicolas Aunai wrote:

Quote:
Tu peux par contre utiliser un
vector<> de pointeurs -- et allouer tes objets dynamiquement, à la
main.


commet ça ? qu'est-ce que ça change... je piges pas bien





vector<*Objet> tab;
vector<Object*> tab;

Ou souvent mieux :
vector<boost::shared_ptr tab;

Quote:
Objet::Objet()
{
for(unsigned int i=0; i tab.push_back(new Objet);
}

Euh, tu crées un tableau d'Objet dans le constructeur d'Objet ? C'est un
appel récursif sans fin, là...

--
Loïc

Back to top
James Kanze
Guest





PostPosted: Sun Feb 08, 2004 2:34 pm    Post subject: Re: vector<objet_perso> et constructeur Reply with quote

Nicolas Aunai <nicolas.aunai (AT) free (DOT) fr> writes:

Quote:
j'ai une classe Objet, et une classe TabObjet qui contient un
vector
chaque Objet à pour membre :

un unsigned int ID, que le caractérise facilement.
un string Name, sorte d'id mais pour l'utilisateur.

et quelques autres paramètres pas très importants...

bref, le constructeur de Objet demande entre autre, l'ID et le Name,
et le constructeur par défaut lui, fixe un ID qui est égal
à l'incrémentation de un, d'une vairable statique
initialisée a 0, ainsi qu'un Name par défaut.

Objet::Objet()
:Name("SansNom"),ID(nb++) //avec static unsigned int nb = 0; dans la
classe
{
}

alors là, ça va bien lorsque j'appelle le constructeur
"manuellement", cependant je ne comprends pas ce qui se passe
lorsque j'apelle le constructeur de TabObjet.

TabObjet::TabObjet():mon_tab(100)
{
}

va créer un vector de 100 Objet, mais comment ceux-ci vont-ils
être crées ? par le constructeur par défaut ?

Par le constructeur de copie.

Quote:
je me demande en fait, si les Objet de mon vector auront bien des
bons ID

Ça dépend ce que tu considères les bons ID. Tous les
éléments dans le tableau seront une copie d'un objet unique, le
seul construit par ton constructeur de copie.

--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93

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.