OVH Cloud OVH Cloud

Appel de fonction

4 réponses
Avatar
Michaël Delva
Bonjour à tous,

soient les 3 classes A,B et C

class A
{
private:
B b;
C c;

foo();
public:
A();
}

class B
{
toto()
}

class C
{
test();
}

Je voudrais que B::toto() puisse appeller C::test()

Pour l'instant je passe un pointeur sur la classe C dans le construteur de
B, comme suit:

class B
{
private:
toto() { C->test(); }
public:
B(C *c);
}

A::foo()
{
C *c = new C();
B *b = new B(c);
b->toto();
//...

}

N'y a-t-il pas plus simple?
Avec les pointeurs de fonction par exemple?

Merci d'avance

4 réponses

Avatar
Jonathan Mcdougall
class A
{
private:
B b;
C c;

foo();
public:
A();
}


;

class B
{
toto()


;

}


;

class C
{
test();
}


;


Je voudrais que B::toto() puisse appeller C::test()


Poste du vrai code la prochaine fois.

Pour l'instant je passe un pointeur sur la classe C dans le construteur de
B, comme suit:

class B
{
private:
toto() { C->test(); }
public:
B(C *c);
}


;

Ce code compile chez vous?

N'y a-t-il pas plus simple?


Que trouve-tu compliqué?

Avec les pointeurs de fonction par exemple?


Les pointeurs vers les fonctions (surtout membres) ont la réputation
d'être pas mal plus "difficiles". Que dirais-tu de

class C
{
public:
void f();
};

class B
{
private:
C &c;

public:
B(C &c);

void g()
{
c.f();
}
};

class A
{
private:
C c;
B b;

public:

A()
: b(c)
{
}

void h()
{
b.g();
}
};

int main()
{
A a;
a.h();
}


Le constructeur de A peut être potentiellement dangereux, car il compte
sur fait que 'c' soit déclaré avant 'b', fait attention. Sinon, tu peux
toujours utiliser des std::auto_ptr.

Mais je crois que tu es en droit de te questionner sur ton design : A
contient B et C, mais B a besoin de C. Est-il correct que ces trois
classes soient séparées? Quel problème essaies-tu de résoudre?


Jonathan

Avatar
Michaël Delva
Mais je crois que tu es en droit de te questionner sur ton design : A
contient B et C, mais B a besoin de C. Est-il correct que ces trois
classes soient séparées? Quel problème essaies-tu de résoudre?


Pour faire simple, B une classe Capture qui crée une vidéo depuis une
source d'acquisition, C est une classe Video qui affiche et manipule une
vidéo (qui peut-être celle créée par B), et A est une classe Indexation qui
enregistre dans une base de données des événements issus de la vidéo.

J'ai besoin que Capture appelle une fonction Change_Video de Video pour
l'informer qu'elle crée une nouvelle vidéo, et donc pour rafraichir
l'affichage...

Avatar
Fabien LE LEZ
On 10 Sep 2004 13:55:36 GMT, "Michaël Delva"
:

N'y a-t-il pas plus simple?


Ben... Tu veux appeler une fonction membre non statique de C, il te
faut forcément un objet de classe C (ou un pointeur, ou une
référence). Donc, a priori, la classe B doit effectivement avoir une
référence ou un pointeur sur l'objet de classe C.


--
;-)

Avatar
Jonathan Mcdougall
Pour faire simple, B une classe Capture qui crée une vidéo depuis une
source d'acquisition, C est une classe Video qui affiche et manipule une
vidéo (qui peut-être celle créée par B), et A est une classe Indexation qui
enregistre dans une base de données des événements issus de la vidéo.

J'ai besoin que Capture appelle une fonction Change_Video de Video pour
l'informer qu'elle crée une nouvelle vidéo, et donc pour rafraichir
l'affichage...


En effet, si tu crois que les objets doivent s'inter-utiliser, c'est la
seule manière. Je dis ça comme ça, mais Video pourrait-elle être
responsable de la capture? Comme ça video.capture() retourne un object
Capture et cette fonction s'est chargée elle-même de tout le reste.
Mais là, je suis un peu dans le néant. Si ce que tu fais fonctionne,
continue.


Jonathan