Bonjour,
Je me pose des questions sur la qualit� d'un code o� une classe de base utilise un pointeur vers une fonction membre, pointant vers une m�thode d'une classe d�riv�e.
Je vous d�cris un peu le programme. J'ai un ensemble d'objets d�rivant d'une classe de base. Le programme doit faire �voluer ces objets en appelant une m�thode progress() sur chacun d'eux. La fa�on d'�voluer de chaque objet n'est pas constante. Par exemple un objet peux commencer par se d�placer, puis change de comportement au bout d'une minute pour changer de taille.
Les diff�rentes �volutions d'objet sont inconnues de la classe de base. Une solution serait de d�clarer la m�thode progress() comme virtuelle, et chaque classe fille ferait un switch pour appeler la bonne m�thode d'�volution.
Un autre m�thode serait d'utiliser un pointeur sur une fonction membre. J'ai �crit le code suivant pour tester, j'aimerais savoir ce que vous en pensez.
Compil� avec g++ 4.2.3, ce code fonctionne tr�s bien. Cependant, je ne sait pas si c'est exceptionnel ou parfaitement d�fini par la norme. Quand une m�thode de "derived" est appel�e par "base", est-ce que le pointeur "this" pointera toujours vers la bonne instance de "derived" ?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 //------------------------------------------------------------------------------ class base { public: typedef void (base::*progress_method_type)(); base(); void progress(); protected: void hook(progress_method_type f) { m_progress_method = f; } private: void idle() {} private: progress_method_type m_progress_method; }; // class base base::base() : m_progress_method(&base::idle) { } void base::progress() { // on appelle la méthode définie par la classe de base (this->*m_progress_method)(); } //------------------------------------------------------------------------------ class derived : public base { public: derived(); private: void first_part(); void second_part(); private: int m_count; }; // class derived derived::derived() : m_count(0) { // on met le progress sur une méthode de la classe dérivée hook((progress_method_type)&derived::first_part); } void derived::first_part() { ++m_count; if (m_count == 24) hook((progress_method_type)&derived::second_part); } void derived::second_part() { --m_count; if (m_count == 0) hook((progress_method_type)&derived::first_part); } //------------------------------------------------------------------------------ int main() { derived d; while (true) d.progress(); return 0; }
Partager