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)。
運算符'+','-','*','/'等不應返回引用。無論如何,這個參考是指什麼?按價值返回。看看http://stackoverflow.com/questions/4421706/operator-overloading – juanchopanza
如果你重載一個運算符'@',你應該重載'@ ='。 – celticminstrel