Wo genau war denn das Problem in der ersten Version? Sollte so doch funktionieren.
Wenn du einen halbwegs neuen Compiler verwendest (Visual Studio 2013 hat einen), dann kannst du auch das Observer-Pattern recht cool umsetzen:
|
C-/C++-Quelltext
|
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
|
class Button
{
using ListenerType = std::function<void()>;
public:
void OnClick()
{
for (const auto& listener : listeners)
{
listener();
}
}
unsigned int AddListener(const ListenerType& listener)
{
auto id = listeners.size();
listeners.push_back(listener);
return id;
}
void RemoveListener(unsigned int id)
{
listeners.erase(std::begin(listeners) + id);
}
private:
std::vector<ListenerType> listeners;
};
|
Angewendet wird das ganze dann so (nur ein paar Beispiele):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
void DoMagic() { std::cout << "Magic!"; }
class Wizard { public: void DoBetterMagic() { std::cout << "OOP Magic!" } };
int main()
{
Wizard wizard;
Button button;
button.AddListener(&DoMagic); // Function
button.AddListener(std::bind(&Wizard::DoBetterMagic, &wizard)); // Method
auto id = button.AddListener([]{ std::cout << "C++11 Magic!"; }); // Lambda
// Output:
// Magic!OOP Magic!C++11 Magic!
button.OnClick();
button.RemoveListener(id);
// Output:
// Magic!OOP Magic!
button.OnClick();
return 0;
}
|
Nur um dir eine Idee zu geben, wie man sowas umsetzen könnte.