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: