Możesz to zrobić na bardzo wiele sposobów.
Na początek pewnie taki jakiego uczy się do dziś. Niskopoziomowe, brzydkie "wachlowanie new i delete" i wskaźniki na wskaźniki:
#include <iostream>
#include <iomanip>
class Matrix {
public:
Matrix(size_t height, size_t width)
: max_height(height), max_width(width) {
data = new int*[max_height]();
for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
data[rowIdx] = new int[max_width]();
}
}
int& valueAccess(size_t height, size_t width) const {
return data[height][width];
}
void show() const {
// Implementacja testowa dla prezentacji rozwiązania.
for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
for(size_t colIdx = 0; colIdx < max_width; ++colIdx) {
std::cout << std::setw(8) << data[rowIdx][colIdx];
}
std::cout << '\n';
}
}
~Matrix() {
for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
delete [] data[rowIdx];
}
delete [] data;
}
private:
size_t max_height;
size_t max_width;
int ** data;
};
int main() {
Matrix matrix(7, 12);
matrix.valueAccess(5, 5) = 20;
matrix.show();
}
W kodzie chodzi mi tylko o pokazanie sposobu alokacji danych. Jak widzisz to podejście wymaga dokładnego sprzątania w destruktorze i ... uwierz mi.. ma bardzo wiele wad. Trzeba mieć poważne powody by tak programować.
Pierwszą poprawką będzie "spłaszczenie tablicy" tak aby nie była wielowymiarowa a jedynie prezentowana była wielowymiarowo. Zwróć uwagę na sposób dostępu do elementów:
#include <iostream>
#include <iomanip>
class Matrix {
public:
Matrix(size_t height, size_t width)
: max_height(height), max_width(width) {
data = new int[height * width]();
}
int& valueAccess(size_t height, size_t width) const {
return data[height * max_height + width];
}
void show() const {
// Implementacja testowa dla prezentacji rozwiązania.
for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
for(size_t colIdx = 0; colIdx < max_width; ++colIdx) {
std::cout << std::setw(8) << valueAccess(rowIdx, colIdx);
}
std::cout << '\n';
}
}
~Matrix() {
delete [] data;
}
private:
size_t max_height;
size_t max_width;
int * data;
};
int main() {
Matrix matrix(7, 12);
matrix.valueAccess(5, 5) = 20;
matrix.show();
}
Już jest lepiej.
Oczywiście lepiej jeszcze użyć std::array czy std::vector ale zaraz (zapewne) odpowiesz "nie mieliśmy/nie wolno" :)