Pointer auf Objekte in einem Array (C++)?

1 Antwort

Ob das, was du da vorhast, funktionieren kann, ist von der Definition deiner Elemente abhängig.

Dem Aufbau deiner Anweisung nach müsste man erst einmal davon ausgehen, dass es eine Klasse gibt, die eine Zelle repräsentieren kann. Der Einfachkeit halber verzichte ich in den folgenden Beispielen auf Kapselung.

class Cell {
  public:
    int row;
};

Nun könnte man sich zwei Arrays anlegen und unter diesen Werte austauschen:

std::array<std::array<Cell, 9>, 9> cells;
std::array<int, 9> rows = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
cells[0][0] = Cell();
cells[0][0].row = rows[0];

Wenn du hingegen Zeiger auf Cell-Objekte in dem mehrdimensionalen Array speicherst, müsste der Code folgendermaßen aussehen:

std::array<std::array<Cell*, 9>, 9> cells;
std::array<int, 9> rows = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
cells[0][0] = new Cell();
cells[0][0]->row = rows[0];

Oder wenn man aus dem Feld in der Klasse einen Zeiger macht:

int* row;

wäre auch bei Zuweisung die Übergabe der Adresse notwendig:

cells[0][0].row = &rows[0]; // array with Cell
cells[0][0]->row = &rows[0]; // array with Cell*

Das funktioniert soweit auch mit Objekten. Die Klasse kann dafür ja einmal noch um ein Feld erweitert werden:

Cell* neighbour;

Und zur Demonstration werden zwei neue Arrays erstellt. Folgend verbleibt cells als ein Array, welches Zeiger speichert. Den anderen Fall solltest du dir nun ja selbst bilden können.

// create cells array with Cell pointers ...
// fill cells[0][0] with object ...

Cell otherCell;
otherCell.row = 5;

std::array<Cell, 1> otherCells1;
otherCells1[0] = otherCell;

std::array<Cell*, 1> otherCells2;
otherCells2[0] = &otherCell;

cells[0][0]->neighbour = &otherCells1[0];
cells[0][0]->neighbour = otherCells2[0];

Als allerletztes Beispiel mache ich aus dem neighbour-Feld ein Array:

std::array<Cell*, 8> neighbours;

Um diesen Feld einen Wert zuzuweisen, müsste dieser ebenso einem Array entsprechen, welches acht Cell-Zeiger in sich aufnimmt.

std::array<Cell*, 8> otherCells;
cells[0][0]->neighbours = otherCells;

Andernfalls könntest du die Werte mit einer Schleife übertragen.