C2Darray - dynamické 2D pole v C++
Petr Wiedemann, 15. březen 2009
Třída C2Darray vytváří dynamicky 2D pole objektů operátorem new. Může se použít pro číselné typy (long, int, double) nebo pro třídy.
V souboru 2darray.h je definován datový typ ARRAY_TYPE, se kterým třída vnitřně pracuje. Například:typedef unsigned long ARRAY_TYPE;
Inicializace pole
Před začátkem práce s polem je nejprve nutné zajistit jeho inicializaci. Tím se rozumí vytvoření matice ukazatelů na objekty uložené v poli. To zajistí funkce SetSize(), které se předává počet řádků a sloupců v poli.
void C2Darray::SetSize(unsigned long uRows, unsigned long uCols)
{
if (m_pRoot)
Free();
unsigned long i, j;
// 1. sloupec pointru
m_pRoot = new ARRAY_TYPE**[uRows];
// radky v 1. sloupci pointru
for (i = 0; i < uRows; i++)
{
m_pRoot[i] = new ARRAY_TYPE*[uCols];
for (j = 0; j < uCols; j++)
{
m_pRoot[i][j] = new ARRAY_TYPE;
}
}
m_Rows = uRows;
m_Cols = uCols;
}
Zrušení pole
Voláním funkce Free() se provede uvolnění objektů a matice ukazatelů z paměti. Tuto funkci volá destruktor třídy C2DArray. Stejně tak je volána ve funkci SetSize() v případě, že je již vytvořena matice ukazatelů.
void C2Darray::Free()
{
unsigned long i, j;
if (m_pRoot == NULL)
return;
for (i = 0; i < m_Rows; i++)
{
for (j = 0; j < m_Cols; j++)
{
delete m_pRoot[i][j];
}
delete m_pRoot[i];
}
delete m_pRoot;
m_pRoot = NULL;
m_Rows = 0;
m_Cols = 0;
}
Přístup k prvkům v poli
Pro přístup k objektům uloženým v poli slouží funkce GetAt() a GetAtPtr(). Funkce GetAt() vrací samotný objekt, takže její použití doporučuji v případě, pokud třída vnitřně pracuje s číselnými typy jako jsou int nebo double. Naopak v případech, kdy je ARRAY_TYPE struktura nebo jiná třída, doporučuji použít funkci GetAtPtr(), která vrací ukazatel na požadovaný objekt.
ARRAY_TYPE C2Darray::GetAt(unsigned long uRow, unsigned long uCol)
{
assert(uRow < m_Rows);
assert(uCol < m_Cols);
return *(m_pRoot[uRow][uCol]);
}
ARRAY_TYPE* C2Darray::GetAtPtr(unsigned long uRow, unsigned long uCol)
{
assert(uRow < m_Rows);
assert(uCol < m_Cols);
return (m_pRoot[uRow][uCol]);
}
Změna hodnoty objektu
Změnit hodnotu objektu je možné funkcí SetAt(). Její použití doporučuji pouze v případě, kdy je ARRAY_TYPE číselný typ (int, long, double). V ostatních případech doporučuji použít GetAtPtr() pro získání ukazatele na objekt a měnit jeho členy přes tento ukazatel.
void C2Darray::SetAt(unsigned long uRow, unsigned long uCol, ARRAY_TYPE value)
{
assert(uRow < m_Rows);
assert(uCol < m_Cols);
*(m_pRoot[uRow][uCol]) = value;
}
Zdrojové soubory třídy: