繁体   English   中英

运算符重载=和const参考

[英]Operator overload = and const reference

我正在尝试为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在返回后将不在范围内,因此它将被删除,并且我的指针将指向未初始化的地址,该死的...

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

这意味着您必须更进一步。 get_r可能声明为

float get_r()

并使其正常工作(正确常量),您应该使其

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;
}

您在这里有两个选择。 一种是让您的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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM