Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > Utiliser les attributs d'un objet depuis un autre objet > Lecture du sujet

Utiliser les attributs d'un objet depuis un autre objet

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne Aravis # Posté le 25/07/2008 à 11:57:56
apt-get install Windows
Avatar
Groupe : Membres
Bonjour,

Un problème bien compliqué (ou pas). J'ai un objet (type : MilieuExterieur) depuis lequel je crée un autre objet (type : Celulle).
Or ma celulle a besoin des attributs du milieu pour marcher.

Image utilisateur


L'idée serait de créer un objet milieu statique comme en java (dixit mon ami).
L'héritage est hors de question pour différentes raisons.

comment faire ?

merci :)

Image utilisateur

Sauvez moi : faites un effort et laissez moi un peu de banquise.
Ne polluez pas pour rien.
Merci.

Bébé nounours

 
Hors ligne askerat # Posté le 25/07/2008 à 13:24:19
Groupe : Membres
Si je comprends bien, ta classe MilieuExterieur contient une ligne Cellule *cell = new Cellule(); ?
Et cet objet cell a besoin des attributs de MilieuExterieur ? T'as pas beaucoup d'options, soit tu crées un lien d'amitié éventuellement, soit tu fournis à Cellule une référence de MilieuExterieur, soit tu nous en dis un peu plus sur la chose, car à mon avis y'a un hic au niveau du design. Faudrait peut être revoir les responsabilitées des objets, et voir si il faut obligatoirement passer par ça, il faut peut être ajouter une entitée à l'histoire.
Hors ligne wissam42 # Posté le 25/07/2008 à 13:31:14
La marijuana c'est mal !
Avatar
Groupe : Membres
depuis cellule tu crée un objet type milieu exterieur que tu nomme m_parent et qui point vers le parent.

code :
Code : C++
1
2
3
4
5
// cellule.h
public :
void setParent(MilieuExterier *parent)
private :
MilieuExterieur *m_parent;


Code : C++
1
2
3
4
5
// cellule.cpp
void Cellule::setParent(MilieuExterier *parent)
{
     m_parent = parent;
}


Code : C++
1
2
3
4
// milieuexterieur.cpp
//tu crée l'obj cellule
Cellule *cell = new Cellule;
Cellule->setParent(this);


voila debrouille toi avec sa ^^ aprés pour acceder o atribut tu fera m_parent->getTonAttibut() ;)


Ds ce cas il n'est aucunement question d'heritage tu crée simplement un pointeur m_parent qui pointe vers l'objet qui l'a crée et a partir de ce pointeur tu peut acceder aux attibuts et aux methodes de la classe qui l'a crée.

Si il y a quelque chose que tu ne trouve pas clair n'hesite pas a poser des questions. ;)
Édité le 25/07/2008 à 13:35:03 par wissam42

Mon tutorial DarkBasic
Aidez à mon projet pour mon tutorial
Image utilisateur Site sur naruto.
Image utilisateur Site sur Bob l'éponge
Image utilisateur
 
Hors ligne Aravis # Posté le 25/07/2008 à 15:53:53
apt-get install Windows
Avatar
Groupe : Membres

pour mieux comprendre



a l'heure actuelle je crée un milieu dans ma celulle (a defaut de mieux).

Code : C++
1
2
3
4
Cellule::Cellule()
{
milieu = new MilieuExterieur();
}

et je crée une cellule dans ma fenêtre principale

Code : C++
1
2
3
4
void FenPrincipale::creerZoneCentrale()
{
cell1 = new Cellule;
}

Mais la cellule utilise des choses dans le milieu (et ca marche puisque le milieu a été créé dans la cellule)

Code : C++
1
2
3
4
5
6
7
8
void Cellule::creerEnergie()
{
	if (milieu->getNutriment() > 0) // si il y'a de quoi se nourir dans le milieu
	{
		m_energie += 2; //la cellule a +2 d'energie
		milieu->setNutriment(-2); //le milieu a -2 de nutriment
	}
}

Mais le probleme c'est que si je crée plusieurs cellule elle sont dans plusieurs milieu. Or (comme en vrai) elle doivent toute est dans le meme milieu.

Pour faire ca j'ai créé un milieu dans la fenêtre principale est j'ai créé les cellules dans le milieu. Mais ça ça ne marche pas car dans ce cas je ne peux plus acceder au milieu.


Code : C++
1
2
3
4
5
6
7
8
void Cellule::creerEnergie()
{
	if (milieu->getNutriment() > 0) //on ne peut pas acceder a mileux
	{
		m_energie += 2; 
		milieu->setNutriment(-2); //la non plus
	}
}


Ca ne marche plus. Milieu est inaccessible (je sais pas faire en tout ca).

deux shemas qui je l'espere seront parlant (c'est pas des shemas d'héritage hein ):
ce que j'ai : http://img440.imageshack.us/img440/2033/classzv1.png
ce que je voudrais : http://img501.imageshack.us/img501/5254/class1dc2.png

wissam42 >> Non ca peux pas marcher. Une fois qu'on a envoyer milieu dans la cellule le milieu est le milieu de la cellule. La cellule va le modifier etc... un autre cellule aura de base le meme milieu mais le modifira autremenent. Ce sera donc deux milieu differents. Tu me suis ? o_O

Image utilisateur

Sauvez moi : faites un effort et laissez moi un peu de banquise.
Ne polluez pas pour rien.
Merci.

Bébé nounours

 
Hors ligne bombadil # Posté le 25/07/2008 à 17:00:36
Avatar
Groupe : Membres
Citation : Aravis
wissam42 >> Non ca peux pas marcher. Une fois qu'on a envoyer milieu dans la cellule le milieu est le milieu de la cellule. La cellule va le modifier etc... un autre cellule aura de base le meme milieu mais le modifira autremenent. Ce sera donc deux milieu differents. Tu me suis ?


C'est pour cela qu'il te propose d'utiliser un pointeur. Par contre, tu ne dois pas utiliser new, le constructeur de cellule doit recevoir en paramètre un pointeur vers MilieuExterieur.
Si tu "modifie" le pointeur, tu modifie l'objet pointé.
Hors ligne Aravis # Posté le 25/07/2008 à 17:29:32
apt-get install Windows
Avatar
Groupe : Membres
Code : C++ - fenPrincipale.cpp
1
2
3
4
5
milieu = new MilieuExterieur();
cell1 = new Cellule;
cell1->setParent(milieu);
cell2 = new Cellule;
cell2->setParent(milieu);


Code : C++ - fenPrincipale.h
1
2
3
MilieuExterieur *milieu;
Cellule *cell1;
Cellule *cell2;


Code : C++ - cellule.cpp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void Cellule::setParent(MilieuExterieur *parent)
{
     m_parent = parent;
}

void Cellule::creerEnergie()
{
	if (parent->getNutriment() > 0)
	{
		m_energie += 2;
		milieu->setNutriment();
	}
}


Code : C++ - cellule.h
1
2
3
4
5
public:
void setParent(MilieuExterieur *parent);

private:
MilieuExterieur *m_parent;


j'en suis là mais ca compile pas (mais pas de msg d'erreur) :

Image utilisateur

Image utilisateur

Sauvez moi : faites un effort et laissez moi un peu de banquise.
Ne polluez pas pour rien.
Merci.

Bébé nounours

 
Hors ligne wissam42 # Posté le 26/07/2008 à 13:06:00
La marijuana c'est mal !
Avatar
Groupe : Membres
mon astuce marche ! j'ai programmé un sudoku : un objet grille qui possede 81 objet cases ! Chaque objet case peut utiliser des attribut(via des accesseurs) et des méthodes de ma classe grille car il ont tous un pointeur (m_parent) du type grille qui pointe vers la grille qui les a créé !


PS : ds ton shemas c'est milieu exterieur qui crée les cellules or ds ton code c'est fenetre principale !

PS 2 : je pense savoir d'ou viens ton probleme ! As-tu inclu les fichiers milieurexterieur.h et cellule.h ds fenetre principale ?
Édité le 26/07/2008 à 13:09:26 par wissam42

Mon tutorial DarkBasic
Aidez à mon projet pour mon tutorial
Image utilisateur Site sur naruto.
Image utilisateur Site sur Bob l'éponge
Image utilisateur
 
Hors ligne Aravis # Posté le 26/07/2008 à 17:30:18
apt-get install Windows
Avatar
Groupe : Membres
Citation : wissam42
mon astuce marche !

J'en doute pas ! Il faut juste que j'arrive a la mettre en place pour mon programme. C'est ca le problème ^^

Citation : wissam42
PS 2 : je pense savoir d'ou viens ton probleme ! As-tu inclu les fichiers milieurexterieur.h et cellule.h ds fenetre principale ?

Il manquait un include de milieuExt.h dans fenPrincipale.h mais ca a pas changé grand chose.

Code : Console
C:\Users\Jr\Site web\Test C-C++\cell>make
mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory `C:/Users/Jr/Site web/Test C-C++/cell'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o release\cell.exe release/celul
le.o release/chrono.o release/FenPrincipale.o release/main.o release/milieuExt.o
 release/moc_celulle.o release/moc_chrono.o release/moc_FenPrincipale.o  -L"c:\Q
t\4.4.0\lib" -lmingw32 -lqtmain -lQtGui4 -lQtCore4
release/FenPrincipale.o(.text+0x167):FenPrincipale.cpp: undefined reference to `
Cellule::Cellule()'
release/FenPrincipale.o(.text+0x18e):FenPrincipale.cpp: undefined reference to `
Cellule::setParent(MilieuExterieur*)'
release/FenPrincipale.o(.text+0x1af):FenPrincipale.cpp: undefined reference to `
Cellule::Cellule()'
release/FenPrincipale.o(.text+0x1d6):FenPrincipale.cpp: undefined reference to `
Cellule::setParent(MilieuExterieur*)'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\cell.exe] Error 1
mingw32-make[1]: Leaving directory `C:/Users/Jr/Site web/Test C-C++/cell'
mingw32-make: *** [release] Error 2
Édité le 26/07/2008 à 17:41:40 par Aravis

Image utilisateur

Sauvez moi : faites un effort et laissez moi un peu de banquise.
Ne polluez pas pour rien.
Merci.

Bébé nounours

 
Hors ligne nov02 # Posté le 26/07/2008 à 18:05:15
On vit pour ne pas être seul
Avatar
Groupe : Membres
Tu as bien mis la prédéclaration du constructeur ? un #include "Cellule.h" dans le Cellule.cpp ?

> Avoir pour Donner,
> Apprendre pour enseigner,
> Vivre pour aimer.

> > Je suis p'tet' bien qu'un p'tiot jeun' d'merd' au final hein ^^ < < bah dit pas ça voyons ...
 
Hors ligne Aravis # Posté le 26/07/2008 à 18:30:03
apt-get install Windows
Avatar
Groupe : Membres
Edit 3 : Ca compile enfin Image utilisateur . Mais quand je lance le programme j'ai le droit a : "le programme a cesser de fonctionner windows cherche une solution au probleme" :'(

D'ou ca peut venir ?
Édité le 26/07/2008 à 22:29:10 par Aravis

Image utilisateur

Sauvez moi : faites un effort et laissez moi un peu de banquise.
Ne polluez pas pour rien.
Merci.

Bébé nounours

 
Hors ligne wissam42 # Posté le 27/07/2008 à 15:03:46
La marijuana c'est mal !
Avatar
Groupe : Membres
montre moi tout ton code.

Mon tutorial DarkBasic
Aidez à mon projet pour mon tutorial
Image utilisateur Site sur naruto.
Image utilisateur Site sur Bob l'éponge
Image utilisateur
 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 267 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.038s (0.0093s)