2015-07-10 71 views
0

我有以下結構用於存儲rgb值。我爲rgb和標量操作重載了常用操作符+, - ,*。結構運算符超載

struct rgb { 
    float r; 
    float g; 
    float b; 

    rgb() : r(0.f), g(0.f), b(0.f) {} 
    rgb(const float& rr, const float& gg, const float& bb): r(rr), g(gg), b(bb) {} 
    rgb(const float& f): r(f), g(f), b(f) {} 

    rgb& operator +(const rgb& a) { 
     rgb t; 
     t.r = this->r + a.r; 
     t.g = this->g + a.g; 
     t.b = this->b + a.b; 
     return t; 
    } 
    rgb& operator +(const float& a) { 
     rgb t; 
     t.r = this->r + a; 
     t.g = this->g + a; 
     t.b = this->b + a; 
     return t; 
    } 
    rgb& operator -(const rgb& a) { 
     rgb t; 
     t.r = this->r - a.r; 
     t.g = this->g - a.g; 
     t.b = this->b - a.b; 
     return t; 
    } 
    rgb& operator -(const float& a) { 
     rgb t; 
     t.r = this->r - a; 
     t.g = this->g - a; 
     t.b = this->b - a; 
     return t; 
    } 
    rgb& operator *(const rgb& a) { 
     rgb t; 
     t.r = this->r * a.r; 
     t.g = this->g * a.g; 
     t.b = this->b * a.b; 
     return t; 
    } 
    rgb& operator *(const float& a) { 
     rgb t; 
     t.r = this->r * a; 
     t.g = this->g * a; 
     t.b = this->b * a; 
     return t; 
    } 
    float sum() { 
     return r + g + b; 
    } 
}; 

當我在下面的函數使用這個結構,我得到一個意想不到的輸出:

inline void foo(rgb &N, 
       rgb &X, 
       rgb &P, 
       rgb &R) { 
    float d = 0.0; 
    rgb d_v; 
    //find the dot product between N and (P-X) 
    d_v = N * (P - X); //this is always 0, 0, 0 
    d = d_v.sum(); 
    R = P - N * d; 
} 

但是,如果使用中介RGB的存儲中間業務,它工作正常:

inline void subspaceProjectCPU(rgb &N, 
          rgb &X, 
          rgb &P, 
          rgb &R) { 
    float d = 0.0; 
    rgb d_v; 
    rgb PX = P - X; 
    //find the dot product between N and (P-X) 
    d_v = PX * N; 
    d = d_v.sum(); 
    rgb Nd = N*d; 
    R = P - Nd; 
} 

有人可以解釋一些這方面的燈​​光? (我知道我沒有處理雙方的標量運算,所以N * d被定義,但不是d * N,其中N是rgb,d是float)。

+4

運算符'+','-','*','/'等不應返回引用。無論如何,這個參考是指什麼?按價值返回。看看http://stackoverflow.com/questions/4421706/operator-overloading – juanchopanza

+0

如果你重載一個運算符'@',你應該重載'@ ='。 – celticminstrel

回答

2

您的運算符函數返回一個局部變量的引用,該運算符函數返回後該局部變量將停止存在。不要那樣做;這是未定義的行爲。只需返回rgb值。