运算符overload =和const引用

时间:2011-10-19 23:35:59

标签: c++ operator-overloading const

我正在尝试用C ++构建一个颜色类,
这不是一个功课只是因为我仍在努力与引用和const。

- 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()),返回类Color的数组[r,g,b,a]。这样:

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

将无效,因为rgba在返回后不再在范围内,因此它将被删除,我的指针将指向未初始化的地址,该死的...

2 个答案:

答案 0 :(得分:5)

  

传递'const Color'作为'float Color :: get_r()的'this'参数'丢弃限定符

这意味着你必须进一步发展。 get_r可能被声明为

float get_r()

并使其工作(const-correct),你应该成功

float get_r() const
  

如果我不将other_color声明为const,会发生什么?

您将无法从const分配合格的Color。您通常希望能够使用const个对象作为赋​​值来源。此外,它的目的是不向代码的读者明确修改源代码。

  

我想将我的变量传递给opengl glColor4v(colorx.return_rgba()),返回类Color的数组[r,g,b,a]。

返回一个包含数组的特殊“车辆”并自动转换为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;
}

答案 1 :(得分:2)

这里有两个选择。一个是让你的operator=直接访问源对象的成员:

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

另一个(在任何情况下你可能想要做的,如果你坚持使用颜色组件的访问器)就是对你所写的访问器进行const限定:

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

const这里是我添加的你显然没有的部分。

编辑:只要将值传递给glColor,我会考虑这样的小前端:

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