Wie mach ichs am besten
-
Hallo Miteinander!
Als kleines, privates Projekt, bin ich gerade dabei, einen eigenen Media Player unter Linux mit SDL zu realisieren.
Allerdings bin ich gerade an einem Punkt angelangt, an dem ich eine kleine Beratung bzgl. Design brauchen könnte repektive was wie in C++ möglich ist.
Die Situation stellt sich folgendermassen dar:Ich hab die Klasse CMenu die in einem Vector die einzelnen Einträge im Bildschirmmenü verwaltet. Die Einträge sind vom Typ CMenuEntry:
class CMenuEntry
{
CMenuEntry(string* pstrName);
string strName;
int xPos;
int yPos;
int eOpcode;
CMenuEntry* pNext;
CMenuEntry* pPrev;
}class CMenu
{
public:
// public operations
CMenu();
void AddEntry(string* pstrText);
void Update(eOpcode* peOperation);
void Show();
private:
vector< CMenuEntry* > rCMenuEntry;
};Nach Einfügen der Einträge zum Vector, werden die Zeiger pPrev und pNext der Klasse CMenuEntry so gesetzt, dass wir eine doppelt verkettete Liste erhalten.
Fast genauso verhält es sich mit meiner Klasse CListView und deren Vector Container, die die einzelnen Files (z.B. für die Playlist) in Form der Klasse CFileSpec verwaltet.class CFileSpec
{
eFileType eType;
int iBase;
int iLevel;
string strName;
string strPath;
CFileSpec* pPrev;
CFileSpec* pNext;
};class CListView
{
CListView();
int iHighlightPos;
int iVisibleLength;
int iViewLevel;
eListPos PrintListView(int offset, int ViewLevelDependent);vector< CFileSpec* > rEntries;
};Nun habe ich festgestellt, dass ich die ganze Zeigerumhängerei beim einfügen bzw. löschen eines Eintrags quasi doppelt schreiben muss. Da man ja grundsätzlich keinen Code doppelt schreibt, bin ich nun schon eine ganze Weile am Knobeln, wie das ganze schön gelöst werden könnte.
Eine Idee war schon eine Basisklasse mit Template für CList und CMenu, die die Zeigerumhängerei zur Verfügung stellt. Ich hab das Vererben allerdings nicht hinbekommen. Ich weiss auch gar nicht so recht, ob dies prinzipiell möglich ist.Eine andere Idee ist eine Basisklasse für CMenuEntry bzw. CFileSpec. In Verbindung mit der oben erwähnten Vererbung für CMenu und CList könnte ich den Vector ohne Template realisieren, allerdings bezeifle ich, dass der Vector auch Unterklassen einer Klasse verwalten kann.
Das war jetzt etwas viel, aber vielleicht hat sich ja einer die Zeit genommen, das Ganze durchzulesen. Habt Ihr irgendwelche Vorschläge?
Gruss
Matthias
-
MoinMoin,
Nun habe ich festgestellt, dass ich die ganze Zeigerumhängerei beim einfügen bzw. löschen eines Eintrags quasi doppelt schreiben muss. Da man ja grundsätzlich keinen Code doppelt schreibt, bin ich nun schon eine ganze Weile am Knobeln, wie das ganze schön gelöst werden könnte.
Eine Idee war schon eine Basisklasse mit Template für CList und CMenu, die die Zeigerumhängerei zur Verfügung stellt. Ich hab das Vererben allerdings nicht hinbekommen. Ich weiss auch gar nicht so recht, ob dies prinzipiell möglich ist.Eine andere Idee ist eine Basisklasse für CMenuEntry bzw. CFileSpec. In Verbindung mit der oben erwähnten Vererbung für CMenu und CList könnte ich den Vector ohne Template realisieren, allerdings bezeifle ich, dass der Vector auch Unterklassen einer Klasse verwalten kann.
Ja, du kannst von einer template-Klasse erben, wenn du dieser bei der Vererbung das Template-Argument übergibst.
class CMenu : public GenericList<CMenuEntry> { ... }
Dazu brauchen CMenuEntry und CFileSpec aber eine gemeinsame Basisklasse, welche die beiden Pointer next und prev besitzt.
Aber nur mal so aus Interesse:
Warum brauchen die beiden Klassen CMenuEntry und CFileSpec eigentlich die next und prev-Pointer? Du verwaltest die Einträge ja schon über einen Vector und die Einträge selber besitzen keine Funktionen, welche diese benötigen würden. Es sind quasi nur Datencontainer.MFG
MacMike
-
Danke Mike!
Werd ich gleich mal ausprobieren. Das könnte die Lösung sein.
Die Prev und Next Pointer brauch ich zwar nicht unbedingt, vereinfachen aber manches schon, z.B. das Scrollen von Menues und Listen (der Sprung vom letzten auf das erste Element usw). Ich hab der Übersichtlichkeit halber nicht alle Methoden aufgeführt.Gruss
Matthias