- 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;