2014-01-28 3 views
1

У меня есть программа, как это:Инициализация элемента данных массива 2D

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?

ответ

0

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

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

Почему у вас есть открытый указатель 'a', указывающий на массив вне класса? Этот класс не создан с надлежащим объектно-ориентированным дизайном. Всегда старайтесь использовать OO при программировании на C++. – Lundin

+0

@ Lundin, ок. Я исправлю это. Но это был небольшой пример ... мне было все равно, кроме ошибки. – klm123

+0

Да, проблема OO - это не только частная инкапсуляция, но и ваш класс не является автономным. Существует зависимость между вашим классом и вызывающим, где класс должен знать и/или требовать, чтобы вещи внешнего мира функционировали по назначению. Могут быть случаи, когда это разумный подход, но в большинстве случаев такие конструкции сомнительны. – Lundin

3

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

A(int (*b)[3]) 

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

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

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

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

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

+1 для использования 'std :: array' – OneOfOne

Смежные вопросы