Вы определили массив локально в стеке в следующей функции:
unsigned char *colour::getRGB(){
unsigned char arr[3] = {red, green, blue};
return arr;
}
Когда функция возвращается, стек уменьшается и массив больше не действителен (как указатель на массив). По этой причине ваша программа аварийно завершает работу при разыменовании указателя.
Чтобы решить эту проблему, вы можете использовать массив для цветов, так как вы знаете размер во время компиляции.
std::array<unsigned char, 3> colour::getRGB(){
std::array<unsigned char, 3> color = {red, green, blue};
return color;
}
Другой альтернативой является выделение в куче вместо стека
unsigned char* colour::getRGB() {
int size = sizeof(unsigned char) * 3; // Get the size of 3 unsigned chars.
unsigned char* color = (unsigned char*) malloc(size);
color[0] = red;
color[1] = green;
color[2] = blue;
return color;
}
Этот метод имеет несколько недостатков. Во-первых, вы должны помнить, чтобы освободить память, выделенную вам, когда закончите с ней.
colour a = colour(255, 0, 255);
unsigned char* rgb = a.getRGB();
// ---- DO STUFF ---
free(rgb);
Во-вторых, это медленно. Для динамического распределения памяти таким способом требуется запросить у операционной системы больше памяти, что занимает немного времени.
В-третьих, поскольку мы уже знаем, что хотим иметь 3 неподписанных символа, динамическое выделение не требуется. Это исключает возможность того, что компилятор выполнит stati c анализ и оптимизацию кода.