Voorbordurend op mijn vorige topic: [C++]return-waardes interpreter-pattern.
Ik ben vandaag aan de slag geweest met het visitor-pattern en ik heb mijn expression-classes iets verandert. Ik heb een visitor-class en mijn expression-classes hebben nu een methode accept(). Deze methode ziet er voor iedere expression-class hetzelfde uit. Ik moet hem echter telkens opnieuw toevoegen, want anders verwijst de this-pointer telkens naar een base-object ipv het derived-object. Dit is ietwat krom verwoord, daarom ik zal het proberen te verduidelijken middels wat code.
Voor de duidelijkheid, dit probleem gaat dus niet specifiek over het visitor-pattern, maar over inheritance.
uitvoer met accept() in derived_expression:
base_expression
derived_expression
uitvoer zonder accept() in derived_expression:
base_expression
base_expression
Ik kan dus voor iedere expression-class een methode accept() toevoegen, maar het irriteert me een beetje. Is het mogelijk om mijn accept-methode alleen in de base-expression-class te definiëren?
[edit]
Overigens heb ik even door de C++ FAQ Lite lopen spitten, maar volgensmij zie ik iets over het hoofd
Ik ben vandaag aan de slag geweest met het visitor-pattern en ik heb mijn expression-classes iets verandert. Ik heb een visitor-class en mijn expression-classes hebben nu een methode accept(). Deze methode ziet er voor iedere expression-class hetzelfde uit. Ik moet hem echter telkens opnieuw toevoegen, want anders verwijst de this-pointer telkens naar een base-object ipv het derived-object. Dit is ietwat krom verwoord, daarom ik zal het proberen te verduidelijken middels wat code.
Voor de duidelijkheid, dit probleem gaat dus niet specifiek over het visitor-pattern, maar over inheritance.
C++:
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
| class base_expression; class derived_expression; class visitor { public: virtual void visit(base_expression* bexp) = 0; virtual void visit(derived_expression* dexp) = 0; }; class base_expression { public: // ik moet deze methode voor elke expression-class opnieuw toevoegen virtual void accept(visitor& v) { v.visit(this); } }; class derived_expression : public base_expression { public: // als ik deze methode weg laat wordt visit(base_expression*) aangeroepen ipv visit(derived_expression*) void accept(visitor& v) { v.visit(this); } } class printer : public visitor { public: void visit(base_expression* bexp) { std::cout << "base_expression" << std::endl; } void visit(derived_expression* dexp) { std::cout << "derived_expression" << std::endl; } }; void test() { base_expression* bexp = new base_expression(); derived_expression* dexp = new derived_expression(); printer p; bexp->accept(p); dexp->accept(p); } |
uitvoer met accept() in derived_expression:
base_expression
derived_expression
uitvoer zonder accept() in derived_expression:
base_expression
base_expression
Ik kan dus voor iedere expression-class een methode accept() toevoegen, maar het irriteert me een beetje. Is het mogelijk om mijn accept-methode alleen in de base-expression-class te definiëren?
[edit]
Overigens heb ik even door de C++ FAQ Lite lopen spitten, maar volgensmij zie ik iets over het hoofd
[ Voor 4% gewijzigd door JeromeB op 19-04-2009 22:59 ]
PC load letter? What the fuck does that mean?