- neben std::vector gibt es unter MS Visual Studio noch ein Objekt, was zur Verwaltung von Objektlisten dient: die Template Klasse CList
- folgender Code erweitert die CList um nützliche Funktionen:
#pragma once //--------------------------------------------------------------------------- #ifndef CListeH #define CListeH //--------------------------------------------------------------------------- template <class T> class CListe : public CList<T, T> { public: // destruktor, damit auch alle Objekte beim Zerstören der Liste // mit aus dem Speicher entfernt werden virtual ~CListe() { delete_all(); }; // fügt Objekt vom Typ T der Liste hinzu void Add(T I) { AddTail(I); }; // gibt Objekt bei iIndex zurück T Item(int iIndex) { T R = NULL; if ((iIndex < GetCount()) && (iIndex >= 0)) { R = ((T)GetAt(FindIndex(iIndex))); } return R; }; // gibt ein Objekt anhand seiner ID zurück (insofern es eine Eigenschaft iId hat) T Item_from_Id(int iId) { T R = NULL; for (int i=0; i<GetCount(); i++) { T RTemp = ((T)GetAt(FindIndex(i))); if (RTemp) { if (RTemp->iId == iId) { R = RTemp; break; } } } return R; }; // löscht ein Item anhand seines Indexes aus der Liste und aus dem Speicher void _delete(unsigned int uiIndex) { T R=((T)GetAt(FindIndex(uiIndex))); RemoveAt(FindIndex(uiIndex)); if (R) { delete R; R = NULL; } }; // löscht ein Item anhand der Id aus der Liste und aus dem Speicher // (auch mehrere mit der selben Id) // gibt die Anzahl der gefundenen (gelöschten) Items zurück int _delete_by_id(int iId) { int iAnzDelObj = 0; for (int i=0; i<GetCount(); i++) { T R=((T)GetAt(FindIndex(i))); if (R) { if (R->iId == iId) { _delete(i); i--; iAnzDelObj++; } } } return iAnzDelObj; }; // löscht alle Objekte in der Liste und im Speicher void delete_all() { while (GetCount() > 0) { _delete(0); } }; // GetNewBlockId() gibt eine gültige freie Block-ID aus der Liste zurück int GetNewBlockId() { bool bFound = true; int iIdCount = 0; while (bFound) { iIdCount++; bFound = false; for (int i=0; i<GetCount(); i++) { if (Item(i)->iId == iIdCount) { bFound = true; break; } else { bFound = false; } } } return iIdCount; }; }; //--------------------------------------------------------------------------- #endif
- verwendet wird das Ganze wie folgt:
// Beispielobjekt zur Verwaltung durch CListe deklarieren class TXYValue { public: double x; double y; int iId; TXYValue(double dx, double dy); { x = dy; y = dy; } ~TXYValue(void); }; // Liste erzeugen CListe<TXYValue*> *pCList = new CListe<TXYValue*>; // Element zu Blockliste hinzufügen TXYValue *pXY = new TXYValue(); pXY->iId = pCList->GetNewBlockId(); pCList->Add(pXY); // Element anhand seines Indexes ermitteln int iIndex = 2; TXYValue *pXY = pBlockList->Item(iIndex); // Element anhand seiner ID ermitteln int iID = 2; TXYValue *pXY = pBlockList->Item_from_Id(iID); // Element anhand seines Indexes löschen int iIndex = 0; pCList->_delete(iIndex); // Element anhand seiner ID löschen int iID = 1; int iDelElements = pCList->_delete_by_id(iID); // nur Elemente der Liste löschen pCList->delete_all(); // Liste und alle Elemente der Liste zerstören delete pCList;