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