Tablica 2D jako zmienna instancji


Więc jeśli mam klasę z tablicą 2D, którą chcę zainicjować z dwoma parametrami przekazanymi do konstruktora, jak bym to zrobił, ciągle napotykam błędy, ponieważ nie pozwala mi to w ogóle zaktualizować tablicy 2D w konstruktor.
--

Aktualizacja z komentarzy

:
W moim pliku nagłówkowym próbowałem obu
int array[][]

i
int **array

a następnie w pliku .cpp w konstruktorze próbuję to zrobić
array = new int[arg1][arg2]

Żadna z deklaracji tablicy w pliku nagłówkowym nie działała.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

w konstruktorze próbuję zrobić array = new

array

[arg1][arg2]

Musisz określić typ tablicy, na przykład
array = new int[arg1][arg2];

zauważ, że

to tylko działa
https://coderoad.ru/936687/
w C ++ 11 - gdy używasz starych standardów, drugi rozmiar tablicy powinien być const (co prawdopodobnie nie jest tym, czego chcesz).
Istnieje również kilka dodatkowych artykułów omawiających ten sam problem:

Idealnie, ponieważ i tak używasz C ++, powinieneś użyć
std :: vector
, jak sugeruje inna odpowiedź.

Jednak wektory zużywają dużo narzutów, prawda? Staram się zachować jasną pamięć. -

Zacznij od
std :: vector
. Gdy aplikacja będzie już funkcjonalnie poprawna, jeśli nadal martwisz się o wykorzystanie pamięci i/lub wydajność,

zrobić testy porównawcze
... Jeśli prawidłowo hermetyzujesz tablicę 2D w klasę, zawsze możesz zmienić rzeczywistą implementację tablicy bez żadnego wpływu na kod, który jej używa.

Technicznie

jeśli chcesz mieć pewność, że masz jeden płaski obszar pamięci zawierający tablicę, do którego możesz użyć tablicy jednowymiarowej

imitacje

Dwuwymiarowa tablica, taka jak poniższy kod (żeby dać ci pomysł, zdecydowanie wymaga pewnych ulepszeń, szczególnie brakuje operatorów kopiowania i przypisania):
class Array2D {
private:
int *array;
int size1;public:
Array2D(int arg1, int arg2) {
size1 = arg1;
array = new int[arg1 * arg2];
} ~Array2D() {
delete[] array;
} int& at(int i1, int i2) {
return array[i1 * size1 + i2];
}
};int main() {
Array2D array(10, 10); array.at(2, 2) = 42;
std::cerr << array.at(2, 2); return 0;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Najprostszym rozwiązaniem byłoby:
std::vector<std::vector<VALUE>> arr2(X, std::vector<VALUE>(Y));
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto przykład tablicy 2d ze sprawdzaniem granic i typem niestandardowym, na podstawie przykładu Andreasa Festera.
#include <stdexcept>template <typename T>
class Array2D {
private:
T *array;
unsigned int sizeX;
unsigned int sizeY;public:
Array2D(unsigned int X, unsigned int Y) {
sizeX = X;
sizeY = Y;
array = new T[X * Y];
} ~Array2D() {
delete[] array;
} T& at(unsigned int X, unsigned int Y) {
if((X > sizeX) || (Y > sizeY))
throw std::out_of_range("Bla bla"); return array[X * sizeX + Y];
}
};int main() {
double MyValue;
Array2D<double> *MyArray = new Array2D<double>(10, 100);
MyArray->at(1,1) = 10.1;
MyValue = MyArray->at(1,1);
printf("Array value = %3.3f\n", MyValue); return 0;
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się