Hallo,
folgende C++ Problematik:
Es existiert eine Template-Klasse List für verkettete Listen
1 | template<class T>
|
2 | class List
|
3 | {
|
4 | static T* First;
|
5 | static T* Last;
|
6 | T* Next;
|
7 | // ...
|
8 | }
|
Nun werden andere Objekte davon abgeleitet und bei deren Konstruktion
automatisch in der Liste verkettet. In diesem Fall sind es verschiedene
Treiberobjekte, die von List abgeleitet werden:
1 | class GenericDriver : public List<GenericDriver>
|
2 | {
|
3 | static void InitAll(void);
|
4 | static void UpdateAll(void);
|
5 | virtual void Init(void) = 0;
|
6 | virtual void Update(void) = 0;
|
7 | // ...
|
8 | }
|
Das hat jetzt den Charme, dass man z.B. alle Treiber an einer Kette
durchlaufen kann, beispielsweise GenericDriver::InitAll(); aufruft und
alle Treiber initialisieren sich mit ihrer eigenen Init()-Funktion. Ein
weiteres Beispiel wäre der millisekündliche Aufruf von Update() über
UpdateAll();
Das Konzept ist soweit gut, funktioniert seit einigen Jahren prima.
Jetzt ergibt sich aber ein Problem:
Eine von GenericDriver abgeleitete Klasse, nennen wir sie
MySpecialDriver benötigt eine eigene Liste, die alle Instanzen von
MySpecialDriver verkettet aber die Basisklasse GenericDriver davon
unabhängig ja immer noch verkettet bleiben soll. Da die Basisklasse
GenericDriver ja bereits von List abgeleitet ist, kann ich die
MySpecialDriver nicht nochmal von List ableiten, sonst werden die
List-Anteile (Next-Pointer) von Basisklasse und abgeleiteter Klasse ja
"ambitious".
Wie könnte ich das elegant machen, dass ich das gleiche List-Template
verwende und dasselbe Treiberobjekt damit 2 unterschiedlichen und
voneinander unabhängigen verketteten Listen angehört?