Ik heb het volgende probleem. Ik heb een logging class die ik altijd beschikbaar wil hebben. Ik heb weinig behoefte om deze iedere keer door te geven via de constructor dus heb ik hier een singleton van gemaakt. De singleton kent de volgende Instance() methode
Dit werkt prachtig. Deze klasse zit in een statische library met nog een aantal platform afhankelijke methodes en klasses. Het hoofdprogramma wordt gelinkt aan deze library. Wanneer ik een linux variant van hetzelfde programma wil dan link ik hem gewoon aan een linux variant van dezelfde statische library.
Tot dusver geen problemen. Het hoofdprogramma gebruikt altijd dezelfde instantie van de LogSystem klasse. Echter wordt er op den duur een DLL dynamisch geladen. Deze DLL wordt ook gelinked met dezelfde statische klasse (hij gebruikt ook platform afhankelijke onderdelen). Wanneer de DLL dezelfde singleton aanroept dan wordt de constructor van LogSysteem gewoon voor een 2e keer uitgevoerd. Logischerwijs omdat de DLL in zijn eigen geheugen blok zit, naast het hoofdprogramma.
Wat ik dus eigenlijk wil is een static library met hierin een class voor het loggen van meldingen die zowel vanuit de DLL als uit het programma kan worden aangeroepen zonder dat ik iedere keer een referentie door moet geven. (Ik zou immers een virtual interface op kunnen stellen voor LogSystem en die door kunnen geven aan de DLL. Kan dit ook via de DllMain methode? Zo ja, is dit ook mogelijk op andere platformen?)
Hoe kan ik dit het mooiste doen? Uiteraard ben ik op zoek naar een oplossing die technisch mooi is en ook onderhoudbaar is. Ik heb echter nog geen pattern gevonden die doet wat ik graag wil dat ie moet doen.
B.v.d.
code:
1
2
3
4
5
6
7
8
9
| LogSystem *LogSystem::Instance(void)
{
static LogSystem *pInstance = NULL;
if(pInstance == NULL)
pInstance = new LogSystem();
return pInstance;
} |
Dit werkt prachtig. Deze klasse zit in een statische library met nog een aantal platform afhankelijke methodes en klasses. Het hoofdprogramma wordt gelinkt aan deze library. Wanneer ik een linux variant van hetzelfde programma wil dan link ik hem gewoon aan een linux variant van dezelfde statische library.
Tot dusver geen problemen. Het hoofdprogramma gebruikt altijd dezelfde instantie van de LogSystem klasse. Echter wordt er op den duur een DLL dynamisch geladen. Deze DLL wordt ook gelinked met dezelfde statische klasse (hij gebruikt ook platform afhankelijke onderdelen). Wanneer de DLL dezelfde singleton aanroept dan wordt de constructor van LogSysteem gewoon voor een 2e keer uitgevoerd. Logischerwijs omdat de DLL in zijn eigen geheugen blok zit, naast het hoofdprogramma.
Wat ik dus eigenlijk wil is een static library met hierin een class voor het loggen van meldingen die zowel vanuit de DLL als uit het programma kan worden aangeroepen zonder dat ik iedere keer een referentie door moet geven. (Ik zou immers een virtual interface op kunnen stellen voor LogSystem en die door kunnen geven aan de DLL. Kan dit ook via de DllMain methode? Zo ja, is dit ook mogelijk op andere platformen?)
Hoe kan ik dit het mooiste doen? Uiteraard ben ik op zoek naar een oplossing die technisch mooi is en ook onderhoudbaar is. Ik heb echter nog geen pattern gevonden die doet wat ik graag wil dat ie moet doen.
B.v.d.