Я получаю компиляцию ошибок, потому что я не могу правильно указать переменную-член класса как указатель на 2D-массив. На этой плате есть много примеров получения указателей на 2D-массивы, но в каждом случае указатель используется немедленно для доступа к данным в массиве, который не является тем, что я делаю. Я хочу сохранить указатель на 2D-массив для общего использования в классе. Я не могу определить правильный состав.
Независимо от того, что я пытаюсь, я получаю такую ошибку. ошибка C2440: "тип cast": невозможно преобразовать из... в...
Кроме того, я не могу назначить переменную-члену NULL.
Я использую MS VC++ 2008 Express.
Здесь мой код, упрощенный:
int _tmain(int argc, _TCHAR* argv[])
{
int _2D[2][3] = { {1,2,3}, {11,22,33} };
return 0;
}
class C
{
public:
C(int* _2dIn[3]) { // <- I don't know how to cast this properly.
init();
m_p2d = (int *[3])_2dIn; // <- The casting error always points to this line.
}
~C(void);
void init(void) {
m_p2d = NULL; // <- This is my second problem.
}
private:
int* m_p2d[3]; // <- And I don't know how to specify this either.
};
Когда вы объявляете аргумент
int* _2dIn[3]
вы фактически объявляете массив указателей вместо указателя на массив.
Вы должны использовать скобки, чтобы получить правильное значение:
int (*_2dIn)[3]
Ваша проблема в том, что элемент представляет собой массив указателей на int
, который не имеет того же макета, что и 2D-массив (в 2D-массиве нет указателей).
Вы можете сделать аргумент конструктору int _2dIn[][3]
, но на самом деле это просто int (*_2dIn)[3]
в маскировке, то есть указатель на массив. Когда вы передаете 2D-массив, он автоматически претерпевает преобразование массива в указатель, и вы получаете указатель на первый элемент. Если вы затем сделаете элемент тем же самым типом, вам не нужно будет вообще что-то делать.
Однако работа с такими массивами, вероятно, приведет вас к неприятностям. Если объект C
переживает массив, который был передан ему, он будет удерживать указатель на недопустимый объект. Вместо этого вы должны посмотреть на использование стандартных типов контейнеров, таких как std::array
или std::vector
.