Перегрузка оператора = и константная ссылка - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь создать класс для цветов в C ++,
это не домашнее задание, просто я все еще борюсь со ссылками и константой.

- Color.h

class Color{
private:
    double r;
    double g;
    double b;
    double a;
public:
    //constructor, getters and setters...
    Color& operator =(Color& other_color); //(1)
}

- Color.cpp

Color& operator=(Color& other_color){
     this->r = other_color.get_r(); //line 41
     this->b = other_color.get_b();
     //and so on...
     return *this;
}

вот так все работает нормально, но я слышал, что нужно добавить const, чтобы избежать того, что по ошибке объект будет изменен операцией присваивания,поэтому нужно объявить другой объект как const.Вот так:

Color& operator =(Color const& other_color); //(2)

но это дает мне такие ошибки:

/Users/../color.cpp:41: error: passing 'const Color' as 'this' argument of 'float Color::get_r()' discards qualifiers

так вот мой вопрос ...

что здесь происходит?во-вторых, что произойдет, если я не объявлю other_color как const?Каковы возможные ошибки?

PS .: маленький бонусный вопрос:
Я хочу передать свою переменную в opengl glColor4v (colorx.return_rgba ()), возвращая массив [r, g, b, a] класса Color.Это:

float* Color::return_rgba(){
    float  rgba[4] = {this->r, this->g, this->b, this->a};
    return rgba;
}

не будет работать, потому что rgba больше не будет находиться в области видимости после возврата, поэтому он будет удален, и мой указатель укажет на неинициализированные адреса, черт ...

Ответы [ 2 ]

5 голосов
/ 20 октября 2011

передача 'const Color' в качестве 'this' аргумента 'float Color :: get_r ()' отбрасывает квалификаторы

Это означает, что вы должны идти дальше. get_r вероятно объявлено как

float get_r()

и чтобы он работал (const-правильно), вы должны сделать это

float get_r() const

секунду, что произойдет, если я не объявлю other_color как const?

Вы не сможете назначить из const -квалифицированного Color с. Обычно вы хотите иметь возможность использовать const объекты, среди прочего, в качестве источника назначения. Более того, это дает намерение не изменять источник, понятный читателю кода.

Я хочу передать свою переменную в opengl glColor4v (colorx.return_rgba ()), возвращая массив [r, g, b, a] класса Color.

Возвращает специальное «средство передвижения», которое будет содержать массив, и автоматически конвертируется в float*. Нечто подобное

struct ColorQuadruplet
{
  float data_[4];
  // add initialization and such here
  operator float*() { return data_; }
};

ColorQuadruplet Color::get_rgba() const
{
  ColorQuadruplet ret;
  // fill ret
  return ret;
}
2 голосов
/ 20 октября 2011

У вас есть два варианта здесь. Во-первых, ваш operator= имеет прямой доступ к членам исходного объекта:

Color &operator=(Color const &other) { 
    r = other.r;
    g = other.g;
    b = other.b;
    a = other.a;
}

Другой (что вы, вероятно, захотите сделать в любом случае, если вы настаиваете на наличии аксессоров для цветовых компонентов вообще) - это констатировать написанные вами аксессоры:

double get_r() const { return r; }
               ^^^^^

const - вот часть, которую я добавил, которой у вас явно нет.

Редактировать: что касается передачи значений в glColor, я бы рассмотрел небольшой интерфейс примерно так:

gl_color(Color const &c) { 
    glColor4d(c.r, c.g, c.b, c.a);
}
...