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
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
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);
};
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 .
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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...
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...
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...
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
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
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
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
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
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
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
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
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
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
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.
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
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
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.
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.