Правильное приведение переменной-члена для двумерного массива

0

Я получаю компиляцию ошибок, потому что я не могу правильно указать переменную-член класса как указатель на 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.

};
Теги:
arrays
pointers
casting

2 ответа

0
Лучший ответ

Когда вы объявляете аргумент

int* _2dIn[3]

вы фактически объявляете массив указателей вместо указателя на массив.

Вы должны использовать скобки, чтобы получить правильное значение:

int (*_2dIn)[3]
  • 0
    Оно работает. Спасибо, оба ответа верны. Это прямо к делу.
0

Ваша проблема в том, что элемент представляет собой массив указателей на int, который не имеет того же макета, что и 2D-массив (в 2D-массиве нет указателей).

Вы можете сделать аргумент конструктору int _2dIn[][3], но на самом деле это просто int (*_2dIn)[3] в маскировке, то есть указатель на массив. Когда вы передаете 2D-массив, он автоматически претерпевает преобразование массива в указатель, и вы получаете указатель на первый элемент. Если вы затем сделаете элемент тем же самым типом, вам не нужно будет вообще что-то делать.

Однако работа с такими массивами, вероятно, приведет вас к неприятностям. Если объект C переживает массив, который был передан ему, он будет удерживать указатель на недопустимый объект. Вместо этого вы должны посмотреть на использование стандартных типов контейнеров, таких как std::array или std::vector.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню