Also jetzt nochmal:
Ich hab halt mein Singleton-Template (s.o.). Dann nutze ich innerhalb einer DLL die Klasse base die von diesem Singleton-Pattern abgeleitet ist.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <map>
#define AE_RENDER 1
#define AE_USER 11
class base : public realcay::Singleton<base>
{
typedef void (base::*EventHandler)(const void*);
private:
std::map<std::size_t, EventHandler> m_Hndls;
public:
void send_message(std::size_t id, const void* data)
{
std::map<std::size_t, EventHandler>::iterator it = m_Hndls.find(id);
if (it != m_Hndls.end()) (*this.*it->second)(data);
}
void register_message(std::size_t id, EventHandler hdnl)
{ m_Hndls[id] = hdnl; }
};
|
Nun soll der Benutzer der DLL aber auch hingehen können und von base ableiten können um eine eigene Message in der std::map eintragen zu können (wie ihr vllt sehr handelt es sich dabei um einen Memberfunktionszeiger auf base::*func.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
class derived : public base
{
public:
derived() : m_int(0) { register_message(AE_RENDER, &derived::on_render); }
private:
void on_render(const void* data) { std::cout << m_int << std::endl; }
private:
int m_int;
};
|
So ... nun wird ja aber im durch das Singelton-Template der Konstruktor der Klasse base aufgerufen ... derived aber natürlich nicht! Wie kann ich das umgehen? Hätte auch einfach eine Template-Klasse aus base machen können und als default-Parameter dann base ... geht allerdings nicht weil wenn ich ja base in der DLL selbst brauche und ich da noch nicht weiß, wie die abgeleitete Klasse heißen wird ...
Steh da glaube ich etwas aufm Schlauch ... jemand eine Idee?