Инициализация элемента данных двумерного массива

У меня есть такая программа:

class A {
int a[2][3];
public:
A(int b[2][3]): a(b) {};
};

int main() {
int b[2][3];
A myclass(b);
return 1;
}

Компилятор говорит:

1.cpp: In constructor 'A::A(int (*)[3])':
1.cpp:5:22: error: incompatible types in assignment of 'int (*)[3]' to 'int [2][3]'

Почему они несовместимы и как я могу инициализировать массив A :: a другим массивом b?

1

Решение

По историческим причинам встроенные типы массивов являются довольно неудобными типами второго класса, которые не могут быть скопированы или переданы в функции по значению. Вместо этого они имеют тенденцию распадаться на указатели; несмотря на синтаксис, ваш аргумент конструктора на самом деле является указателем, эквивалентным

A(int (*b)[3])

отсюда и сообщение об ошибке, сообщающее, что указатель не может быть назначен массиву.

Вы можете заключить массив в класс, сделав его более удобным для копирования типом; в C ++ 11 стандартная библиотека уже обеспечивает такой array шаблон:

typedef std::array<std::array<int,2>,3> array;
array a;
A(array const & b) : a(b) {}

Если вы действительно хотите придерживаться встроенного массива, то вам нужно скопировать данные с помощью steam:

A(int b[2][3]) {std::copy(b, b+3, a);}
3

Другие решения

int a[2][3] в основном постоянный указатель. Нельзя назначить постоянный указатель. Вы можете копировать только полный контент. Если вам нужно скопировать только указатель, вам нужно объявить указатель вместо массива:

class A {
int (*a)[3];
public:
A(int b[2][3]): a(b) {};
};
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector