簡體   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