Передать массив в метод объекта - PullRequest
1 голос
/ 14 декабря 2011

Я сталкиваюсь с проблемой базового массива, которая, похоже, не позволяет мне разобраться.

У меня есть класс "StaticDisplayLayer", и конструктор принимает 2 параметра - int и указатель намассив из 3 коротких целых без знака:

//constructor definition:
StaticDisplayLayer(int type, unsigned short *displayColor[3]);

//constructor code:
StaticDisplayLayer::StaticDisplayLayer(int type, unsigned short *dColor[3]) : DisplayLayer(type)
{
    displayColor = dColor;
}

Я пытаюсь создать экземпляр этого класса, используя следующее:

unsigned short layerColor[3] = {(unsigned short)255,(unsigned short)255,(unsigned short)255};
StaticDisplayLayer myLayer(1, &layerColor);

Насколько я понимаю, & layerColor является указателем намассив layerColor, но компилятор выдает мне следующую ошибку:

no matching function for call to `StaticDisplayLayer::StaticDisplayLayer(int, short unsigned int (*)[3])'
Candidates are:
   StaticDisplayLayer::StaticDisplayLayer(const StaticDisplayLayer&)
   StaticDisplayLayer::StaticDisplayLayer(GLenum, short unsigned int**)

Я знаю, что второй кандидат - тот, который я пытаюсь использовать, но, очевидно, я не понимаю концепцию указателя на массив,Если бы кто-то мог пролить некоторый свет на то, как вызывать этот конструктор и / или какие-либо ресурсы, объясняющие это, я был бы признателен - до сих пор мои поиски в Интернете на самом деле не сильно возросли.

Ответы [ 3 ]

5 голосов
/ 14 декабря 2011

unsigned short *dColor[3] это не указатель на массив, это указатель на массив указателей. [3] игнорируется и заменяется другим указателем, так как это параметр функции. Другими словами, это распада . Чтобы создать указатель на массив, используйте unsigned short (*dColor)[3], который является указателем на массив размером от 3 до unsigned short.

Еще лучше в C ++ использовать ссылку на массив:

unsigned short (&dColor)[3]

И просто передать layerColor.

1 голос
/ 14 декабря 2011

unsigned short displayColor [3] говорит о массиве беззнаковых коротких указателей или unsigned short * по существу.

unsigned short layerColor [3] - это массив беззнаковых шорт, а не массив беззнаковых коротких указателей.

Я бы вместо этого создал структуру или класс для цвета, а затем передал бы указатель или ссылку на него.

1 голос
/ 14 декабря 2011

&layerColor имеет тип pointer to array of 3 unsigned shorts. С другой стороны, ваш конструктор ожидает unsigned short *[3], то есть array of three pointers to unsigned short. На самом деле, как тип параметра функции, это pointer to pointer to unsigned short - измерение полностью игнорируется. Я думаю, что вы имели в виду, что ваш конструктор просто взял указатель на unsigned short и передал layerColor

StaticDisplayLayer(int type, unsigned short *displayColor);

unsigned short layerColor[3] = {255,255,255};
StaticDisplayLayer myLayer(1, layerColor);

Обратите внимание, что в этом случае вызывающая сторона несет ответственность за передачу массива, содержащего как минимум 3 элемента. В качестве альтернативы вы можете заставить функцию принимать массив из 3 коротких строк с помощью

 StaticDisplayLayer(int type, unsigned short (&displayColor)[3]);

Но в этом случае вы не сможете передавать динамически размещенные массивы.

Я не могу не заметить, что вам не хватает определенных базовых знаний по C ++, поэтому я предлагаю вам прочитать хорошую книгу по C ++

...