Voor mijn scripting-engine (zie onder andere dit topic) heb ik een class ScriptObject gemaakt. Objecten die scriptable worden moeten deze classe implementen. Ze kunnen daarna met de functie Bind(wstring, Member) een member functie binden aan een string via de map. Via Execute, die door de scripting engine wordt aangeroepen (als inderdeel van de class Scriptable overigens) wordt dan de juiste member-functiepointer opgezocht en uitgevoerd:
Waarin CommandType=std::wstring en de ref<> dingen gewoon refcounted pointers zijn, maar dat doet er hier niet toe
Wat het probleem nu is, is dat het niet werkt! Ik krijg een dikke nullpointer (0xC0000005) bij het aanroepen van (in dit geval) toString via het script. Aan de scripting engine ligt het niet, want Execute wordt netjes aangeroepen. De fout lijkt te zitten in het stukje daarna. Ik wil vanuit de base class (die getemplate is met T=naam van child class, ben de naam van dat pattern even kwijt...) dus een member function pointer gebruiken naar een member function van de child class! Wat doe ik fout?
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
| template<typename T> class ScriptObject: public virtual Scriptable { protected: ScriptObject() { } virtual ~ScriptObject() { } typedef ref<Scriptable> (T::*Member)(ref<ParameterList>); typedef std::map<CommandType, Member> MemberMap; void Bind(Command c, Member p) { _members[c] = p; } public: virtual ref<Scriptable> Execute(Command c, ref<ParameterList> p) { MemberMap::const_iterator it = _members.find(c); if(it!=_members.end()) { Member m = it->second; return (((T*)this)->*m)(p); } return 0; } protected: typename MemberMap _members; }; // Voorbeeld implementatie: class MyScriptableObject: public ScriptObject<MyScriptableObjet> { .... MyScriptableObject() { Bind(L"toString", &MyScriptableObject::ToString); } ref<Scriptable> ToString(ref<ParameterList> p) { return new ScriptString(L"Hello world"); } } |
Waarin CommandType=std::wstring en de ref<> dingen gewoon refcounted pointers zijn, maar dat doet er hier niet toe
Wat het probleem nu is, is dat het niet werkt! Ik krijg een dikke nullpointer (0xC0000005) bij het aanroepen van (in dit geval) toString via het script. Aan de scripting engine ligt het niet, want Execute wordt netjes aangeroepen. De fout lijkt te zitten in het stukje daarna. Ik wil vanuit de base class (die getemplate is met T=naam van child class, ben de naam van dat pattern even kwijt...) dus een member function pointer gebruiken naar een member function van de child class! Wat doe ik fout?