Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme pour faire un Vecteur D'objet

5 réponses
Avatar
Florian
J'ai un probleme je souhaite crée un Vecteur d'objet, mais je n'arrive
pas à acceder correctement aux élélement de mon objet quand il se trouve
dans le vecteur,
j'ai mis en piece jointe mes fichier

je ne vois pas qu'elle methode je doit addapté pour acceder à mes
Tableau gencouleur qui se trouve dans ma classe souris, quand j'ai
inserer mon objet dans le vecteur

souris.h

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

class souris
{
private :
int sex;
int couleur;
int age;
int mort;
int apariement;

souris *mere;
souris *pere;
souris *conjoint;

public :
int gencouleur[];
souris();
souris(int,int);
souris(int*,int*,souris&, souris&);
~souris()
{
};

void couple(souris&);
void mourir();
int iscouple();
int ageplus();
int getage();
// methode le la souris à couplé en dessout
int getsex();
int getcoul();
int ispere(souris&);
int ismere(souris&);
int isconjoint(souris&);
};


//souris.C

#include "souris.h"

souris ::souris(int S,int C)
{
sex=S; // 0 mal et 1 femelle
couleur=C; // 0 noir 1 blanc 2 gris
gencouleur[0]=C, gencouleur[1]=C;
age=0; // initialisation de l'age a 0 jours
mort=0;// vie =0 et mort =1
}
// construction d'une souris pour la naissance de souris

souris::souris(int Pe[2],int Me[2],souris &P, souris &M)
{

age=0;
mort=0;
float x=((float)rand()/(RAND_MAX));
float y=((float)rand()/(RAND_MAX));
cout<<"x="<<x<<" y="<<y<<endl;
cout<<" gene couleur pere"<<Pe[0]<<Pe[1]<<endl;
cout<<" gene couleur mere"<<Me[0]<<Me[1]<<endl<<endl;
// tirage aléatoire du sex et de la couleur

if (y>0.5)
{
gencouleur[0]=Pe[0];
gencouleur[1]=Me[0];
}
else if (y<0.5)
{
gencouleur[0]=Pe[0];
gencouleur[1]=Me[1];
}
else
{

gencouleur[0]=Pe[1];
gencouleur[1]=Me[0];
};

//initialisation de la couleur
if ( gencouleur[0]==0 && gencouleur[1]==0)
{ couleur=0; }
else if ( gencouleur[0]==0 && gencouleur[1]==1 || gencouleur[1]==0 &&
gencouleur[0]==1 )
{ couleur=2; }
else if ( gencouleur[0]==1 && gencouleur[1]==1)
{ couleur=1; }
if ( x<0.5)
{sex=0;}
if (x>=0.5)
{sex=1;};

pere=&P;
mere=&M;

};

//methode
int souris::ageplus()
{
if (mort==0)
age=age+1;
mourir();

};

void souris::couple(souris &M)
{
if(age>=150)
{
apariement=1;
conjoint=&M;
}
};
// cette méthode vérifie si la souris est en couple
int souris::iscouple()
{
if ( apariement==1) return(1);
else return(0);
};

void souris::mourir()
{
if (age==720)
{
mort=1;
}
}
int souris::getage()
{
return(age);
};


int souris::getsex()
{
return(sex);
};

int souris::getcoul()
{
return(couleur);
};

int souris::ispere(souris &S)
{
if(pere == &S) return(true);
else return(false);
};

int souris::ismere(souris &S)
{
if(mere == &S) return(1);
else return(0);
};

int souris::isconjoint(souris &S)
{
if(conjoint == &S) return(1);
else return(0);
};



// Main.c


#include <iostream.h>
#include "souris.h"
#include <vector.h>


void recherchecouple();

void creationcouple(souris &S1,souris &S2)
{
S1.couple(S2);
S2.couple(S1);
};

// fonction qui recherche une souris non apparier et tire au hasart la
premiere souris non apparier.

int main(void)

{
srand(time(NULL));
vector<souris> SM;
vector<souris> SF;
int T[2];
// definir un vecteur de souris mal
//definir un vecteur de souris femelle

souris SM1(0,0);
souris SF1(1,0);
cout<<" gene couleur pere a"<<SM1.gencouleur[0]<<SM1.gencouleur[1]<<endl;
creationcouple(SM1,SF1);
SM.push_back(SM1);
SF.push_back(SF1);
SM1.couple(SF1);
SF1.couple(SM1);
T[0]=SM[0].gencouleur[0];
T[1]=SM[0].gencouleur[1];
cout<<" gene couleur pere"<<T[0]<<T[1]<<endl;
cout<<" gene couleur
mere"<<SF[0].gencouleur[0]<<SF[0].gencouleur[1]<<endl;

cout<<"le couple S1 "<<SM1.iscouple()<<endl;
souris SM2 (1,1);
souris SF2(0,1);

// fonction de recherche de souris
// fontion de naissance d'une porté souris
creationcouple(SM2,SF2);
SM.push_back(SM2);
SF.push_back(SF2);


souris Senfant(SM[0].gencouleur,SF[0].gencouleur,SM[0],SF[0]);

cout<<"la couleur de l'enfant est "<<Senfant.getcoul()<<" de sex
"<<Senfant.getsex()<<endl<<endl;
souris Senfant2(SM[1].gencouleur,SF[1].gencouleur,SM[1],SF[1]);
cout<<"la couleur de l'enfant 2 est "<<Senfant2.getcoul()<<" de sex
"<<Senfant2.getsex()<<endl;
// boucle qui fait des enfants

}


Merci de me répondre en me donnant une petite explication,
ou me disant qu'elle est la methode .

Florian

5 réponses

Avatar
Alex
Florian wrote:

J'ai un probleme je souhaite crée un Vecteur d'objet, mais je n'arrive
pas à acceder correctement aux élélement de mon objet quand il se trouve
dans le vecteur,
j'ai mis en piece jointe mes fichier

je ne vois pas qu'elle methode je doit addapté pour acceder à mes
Tableau gencouleur qui se trouve dans ma classe souris, quand j'ai
inserer mon objet dans le vecteur


ton tableau ne semble pas bien déclaré :

int gencouleur[];

cela réserve un pointeur mais pas de mémoire pour les éléments.

Ce que j'ai vu dans ton code ensuite, il y a gencouleur[0] et de 1, donc
pourquoi ne pas mettre direct :

int gencouleur[2];

?

par contre pour passer ton tableau en paramètre tu peux adopter int *
puisque c'est un pointeur en effet sur int.

PS : si ma réponse est entièrement à côté de la plaque, je suis vraiment
désolé, je n'ai peut-être pas bien compris ta question...

Avatar
kanze
Florian wrote:
J'ai un probleme je souhaite crée un Vecteur d'objet, mais je
n'arrive pas à acceder correctement aux élélement de mon objet
quand il se trouve dans le vecteur,


Ne pas accéder correctement, ça veut dire quoi, exactement ?

j'ai mis en piece jointe mes fichier

je ne vois pas qu'elle methode je doit addapté pour acceder à
mes Tableau gencouleur qui se trouve dans ma classe souris,
quand j'ai inserer mon objet dans le vecteur

souris.h

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

class souris
{
private :
int sex;
int couleur;
int age;
int mort;
int apariement;

souris *mere;
souris *pere;
souris *conjoint;

public :
int gencouleur[];


Si cette ligne compile, je me poserais des questions sur ton
compilateur. Il faut donner la taille du tableau.

souris();
souris(int,int);
souris(int*,int*,souris&, souris&);
~souris()
{
};


Les pointeurs qui précède me fait penser que ton classe à une
sémantique à identité ; c-à-d que remplacer une instance d'un
objet par un autre, situé ailleurs, ne marche pas. Et que
surtout, le constructeur de copie et l'opérateur d'affectation
fournis par le compilateur n'ont pas une sémantique adéquate, et
que probablement, tu ne veux pas supporter ces opérations.

Évidemment, sans supporter ses opérations, tu ne peux pas mettre
l'objet dans une collection standard (ni d'ailleurs dans les
différentes collections pré-standard que j'ai connues). En
général, quand un objet a une identité, il faut travailler avec
une sémantique de référence, et des collections de pointeurs.

Pour la reste, je ne vais pas chercher en détail. Mais essaie
déjà à définir une politique vis-à-vis de la copie, et voir ce
que ça donne.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
kanze
Alex wrote:
Florian wrote:

J'ai un probleme je souhaite crée un Vecteur d'objet, mais
je n'arrive pas à acceder correctement aux élélement de mon
objet quand il se trouve dans le vecteur, j'ai mis en piece
jointe mes fichier

je ne vois pas qu'elle methode je doit addapté pour acceder
à mes Tableau gencouleur qui se trouve dans ma classe
souris, quand j'ai inserer mon objet dans le vecteur


ton tableau ne semble pas bien déclaré :

int gencouleur[];


Non, ce n'est pas bien déclaré.

cela réserve un pointeur mais pas de mémoire pour les éléments.


Comment ça, réserver un pointeur. C'est une déclaration d'un
tableau, non d'un pointeur, et on n'est pas dans la déclaration
d'un paramètre d'une fonction. La déclaration est d'un tableau
de longueur inconnu. C'est donc un type incomplet. Et la norme
interdit les types incomplets dans la définition d'une classe.

Ce que j'ai vu dans ton code ensuite, il y a gencouleur[0] et
de 1, donc pourquoi ne pas mettre direct :

int gencouleur[2];

?


Ça serait une solution. Dans ce cas-ci, probablement la bonne ;
d'après le code, je parierais sur une simulation génétique, avec
gencouleur les deux gènes de couleur qu'a chaque souris.

Mais je doute que ce soit le seul problème. La classe souris
contient plusieurs pointeurs à souris, ce qui fait penser à une
graphe (surtout donné les noms de ces pointeurs). Or, des
pointeurs, ça pose un problème si on replace un objet par un
autre avec la même valeur. Chose que std::vector fait de temps
en temps quand on fait un push_back.

Dans la pratique, on pourrait dire qu'il y a des objets à
valeur, et des objets d'entité. (C'est une très grande
simplification, mais ça suffit pour ici.) Des objets à valeur
supportent bien la copie et l'affectation ; si un objet en a
besoin, il en prend une copie, et non un pointeur à l'objet. Des
objets d'entité ont une identité, et ne supporte pas la copie.
On les accède prèsque toujours au moyen d'un pointeur ou d'une
référence. Mais puisqu'ils ne peuvent pas être copiés, on ne
peut pas les mettre dans une collection standard.

Dans son cas, la solution évidente, c'est d'utiliser des
vector<souris*>, et d'allouer tous les souris dynamiquement. Ce
qui suppose une gestion manuelle de la mémoire. (Et attention :
ne fait pas l'erreur de conseiller boost::shared_ptr. Il ne
marche pas ici, à cause des cycles.)

par contre pour passer ton tableau en paramètre tu peux
adopter int * puisque c'est un pointeur en effet sur int.


Ce n'est pas un pointeur sur int. En revanche, il se convertit
en pointeur à int dans beaucoup de contextes. Si on ne les
connaît pas bien, et qu'on n'est pas sûr de son coup, il vaut
mieux passer en std::vector, bien que pour un tableau de deux
int, ça me semble un peu l'« overkill ».

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Florian
Bonjours et merci pour les réponse,

Oui tout mon code compile je compile avec g++ de la mandrake 10.1;
et la ligne que tu dit qui ne devrait pas compilé c'est les lignes qui
se trouve dans le fichier d'entete le souris.h mais je vais essayer ca
doit etre la raison que cela ne donne pas ce qu'il faut car je ne
déclare pas la dimension ca doit etre la raison.

Merci je vais essayer si probleme je Referait appelle.

A Bientot
Avatar
Florian
Bonjours et merci pour les réponse,

Oui tout mon code compile je compile avec g++ de la mandrake 10.1;
et la ligne que tu dit qui ne devrait pas compilé c'est les lignes qui
se trouve dans le fichier d'entete le souris.h mais je vais essayer ca
doit etre la raison que cela ne donne pas ce qu'il faut car je ne
déclare pas la dimension ca doit etre la raison.

Merci je vais essayer si probleme je Referait appelle.

A Bientot



C'etait bien ca le probleme car apres j'accede au donné sans probleme,
merci de votre aide.

Florian