Pointer auf Objekte in einem Array (C++)?
Ich arbeite grade an einem Sudoku-Löser, der das Sudoku über Logik lösen soll und nicht über Brute-Force beim einsetzen.
Als Klassen habe ich die Zellen, die Zeilen, die Spalten und die Boxen.
Ich habe mir ein 2D-Array von den Zellen gemacht und jeweils ein 1D-Array für den Rest. In der Zellen-Klasse habe ich jeweils die anderen Klassen als Teil von dieser definiert.
Da - zumindest meines nicht ganz ausgereiften Wissens - ein Array ja ohnehin eine Ansammlung von Pointern ist habe ich dann einfach z.B. Zelle[0][0].Zeile = Zeile[0].
Da ich diese Frage stelle funktioniert das aber offensichtlich aber nicht.
Daher die Frage: Wie gehts richtig?
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.