OVH Cloud OVH Cloud

Trouver le nom d'une classe

2 réponses
Avatar
jean-luc Biord
Bonjour, voici mon problème:
Dans le programme suivant tout fonctionne bien. La constructeur appelle
une fonction de la classe qui l'appelle.

class A
{
public:
void retour() { };
};

class C
{
public:
C::C( A *p);
private:
A *parent;
};

C::C( A *p ) : parent(p)
{
parent->retour();
}

void main()
{
A *a = new A();
C *c = new C(a);
}

Voici ce que je voudrais réussir à faire:
Avec une autre classe B, que C puisse appeller la fonction retour() de A
ou de B sans spécifier le nom de la classe parent dans le constructeur :

class A
{
public:
void retour() { };
};

class B
{
public:
void retour() { };
};

class C
{
public:
C::C( Generique *p);
private:
Generique *parent;
};

C::C( Generique *p ) : parent(p)
{
parent->retour();
}

void main()
{
A *a = new A();
B *b = new B();
C *c = new C(a);
C *c2 = new C(b);
}

Oui mais ça ne compile pas, que faire ?
merci

2 réponses

Avatar
Twxs
jean-luc Biord wrote:

Bonjour,
bonjour

Voici ce que je voudrais réussir à faire:
Avec une autre classe B, que C puisse appeller la fonction retour() de A
ou de B sans spécifier le nom de la classe parent dans le constructeur :

il faut utiliser les methodes virtuelles

et faire heriter les classes A et B d'une classe commune
(servant d'interface) ici nommee Generic possedant la methode
retour.


class Generic{
public:
virtual void retour() =0;
};

le = 0 signifie que la methode est virtuelle pure
i.e. chaque classe heritant de Generic *doit* implementer
la methode retour. le mettre uniquement virtuelle permet de
specifier un comportement par defaut.



class A
: public Generic

{
public:
void retour() { };
};

class B
: public Generic

{
public:
void retour() { };
};

class C
{
public:
C::C( Generique *p);
private:
Generique *parent;
};

C::C( Generique *p ) : parent(p)
{
parent->retour();
}

void main()
{
A *a = new A();
B *b = new B();
C *c = new C(a);
C *c2 = new C(b);
}




Twxs

Avatar
drkm
Twxs writes:

jean-luc Biord wrote:

Voici ce que je voudrais réussir à faire:
Avec une autre classe B, que C puisse appeller la fonction retour()
de A ou de B sans spécifier le nom de la classe parent dans le
constructeur :


il faut utiliser les methodes virtuelles
et faire heriter les classes A et B d'une classe commune


Ca dépend. Le PO peut également employer un modèle de classe. Ses
classes A et B ont elles réellement un lien de parenté ? D'après le
nom qu'il donne à la classe dans l'illustration de ce qu'il veut
faire, `Generique', je pencherais même plutôt pour le modèle de
classe. Mais il n'y a que lui qui sait, pour l'instant.

Sinon, pour une idée du modèle de classe :

template< class Generique >
class C
{
public:
C::C( Generique * p ) ;
private:
Generique * parent ;
} ;

Mais si tout cela t'est étranger (le PO), et les templates, et
l'héritage, je te conseille d'investir un peu d'argent dans un bon
bouquin C++ et un peu de temps dans sa lecture.

--drkm