Interaction entre objets

Résolu
cs_kharrat Messages postés 71 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 29 mars 2007 - 29 juin 2006 à 16:47
cs_kharrat Messages postés 71 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 29 mars 2007 - 30 juin 2006 à 12:54
Salut,

Je cherche à implémenter une relation d'association 1-1 entre 2 objets de 2 classes différentes.

Mon code:
------------------------------------------
class Obj1
{
private:
   Obj2 *lienObj2 ;
} ;

class Obj2
{
private:
   Obj1 *lienObj1 ;
} ;
------------------------------------------
Bien entendu, ce code génère une erreur de compilation car la classe Obj1 ne connait pas la classe Obj2 (définie plus bas). J'ai bien essayé de déclarer la classe Obj2 au dessus de Obj1 en écivant:
------------------------------------------
class Obj2 ;
------------------------------------------
au dessus de la définition de Obj1, mais cela ne marche toujours pas.

Je crois que ce problème est très facile à résoudre, mais je n'ai pas trouvé comment . Quelqu'un pourrait-il me donner un petit coup de pouce ?

Merci,
Kharrat

8 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 juin 2006 à 12:00
Oui d'accord, mais c'est parce que tu ne sépare pas assez l'interface du code. Dans O2, tout ce qui concerne O1 (sauf la déclaration du pointeur) ne peut être fait avant la définition de O1.

class O1 ;

class O2
{
private:
  O1 *lienO1 ;
public:
  O2();
  ~O2();
  void jeTravaillePourO2();
  void O22O1();
};

class O1
{
...
};

//Implémentation des méthodes de O2:
O2::O2()
{
  lienO1 = new O1() ; // Le type O1 est bien défini ici
  cout << "++ Construction d'un O2" << endl ;
}

O2::~O2()
{
  cout << "-- Destruction d'un O2" << endl ;
}

void O2::jeTravaillePourO2()
{
  cout << "Je travaille pour O2" << endl ;
}

void O2::O22O1()
{
  lienO1->message() ;
}
_____________________________________
Un éditeur de ressources gratuit pour Windows
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 juin 2006 à 17:56
Comme tu le dis, ceci devrait marcher:

class Obj2;
class Obj1
{
private:
   Obj2 *lienObj2 ;
} ;

class Obj2
{
private:
   Obj1 *lienObj1 ;
} ;

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_kharrat Messages postés 71 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 29 mars 2007
30 juin 2006 à 00:09
J'ai essayé ça avec trois compilateurs différents et ça ne marche pas... : Visual 6, Dev et xlC (un compilo Unix).
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
30 juin 2006 à 10:17
J'ai testé sous devcpp, ca marche très bien.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_kharrat Messages postés 71 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 29 mars 2007
30 juin 2006 à 10:34
Ce bout de code là marche. Mais as-tu essayé d'envoyer des messages à Obj2 depuis Obj1 ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 juin 2006 à 11:28
Donne un code qui ne marche pas pour illustrer tes propos

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_kharrat Messages postés 71 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 29 mars 2007
30 juin 2006 à 11:48
Ok, voir ci-dessous:
--------------------------------------------------------------------------
#include
using namespace std ;


class O1 ;


class O2
{
private:
        O1 *lienO1 ;
public:
        O2()
        {
                lienO1 = new O1() ;
                cout << "++ Construction d'un O2" << endl ;
        }
        ~O2()
        {
                cout << "-- Destruction d'un O2" << endl ;
        }
        void jeTravaillePourO2()
        {
                cout << "Je travaille pour O2" << endl ;
        }
        void O22O1()
        {
                lienO1->message() ;
        }
} ;

class O1
{
private:
        O2 *lienO2 ;
public:
        O1()
        {
                cout << "++ Construction d'un O1 sans parametre" << endl ;
        }
        O1(O2 *extO2)
        {
                cout << "++ Construction d'un O1" << endl ;
                this->lienO2 = extO2 ;
        }
        ~O1()
        {
                cout << "-- Destruction d'un O1" << endl ;
        }
        void jeTravaillePourO1()
        {
                lienO2->jeTravaillePourO2() ;
        }
        void message()
        {
                cout << "J'envoie un message de O2 vers O1" << endl ;
        }
} ;


int main()
{
        O2 *unO2Tas = new O2() ;
        O1 *unO1Tas = new O1(unO2Tas) ;


        unO1Tas->jeTravaillePourO1() ;


        delete unO1Tas ;
        delete unO2Tas ;


        return 0 ;
}
---------------------------------------------------------------------

Pour info: voici le message que je reçoit à la compilation:

"Obj.cpp", line 13.26: 1540-1109 (S) The use of undefined class "O1" is not valid.
"Obj.cpp", line 26.23: 1540-0251 (S) The "->" operator cannot be applied to the undefined class "class O1".

+,
Kharrat
0
cs_kharrat Messages postés 71 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 29 mars 2007
30 juin 2006 à 12:54
Merci vecchio56 !

C'est bon.
0
Rejoignez-nous