Interaction entre objets [Résolu]

Signaler
Messages postés
71
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2007
-
Messages postés
71
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2007
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
71
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2007

J'ai essayé ça avec trois compilateurs différents et ça ne marche pas... : Visual 6, Dev et xlC (un compilo Unix).
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
J'ai testé sous devcpp, ca marche très bien.
Messages postés
71
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2007

Ce bout de code là marche. Mais as-tu essayé d'envoyer des messages à Obj2 depuis Obj1 ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Donne un code qui ne marche pas pour illustrer tes propos

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
71
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2007

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
Messages postés
71
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2007

Merci vecchio56 !

C'est bon.