繁体   English   中英

结构运算符重载

[英]Struct operator overloading

我有以下旨在存储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是浮点数)。

您的操作员函数返回对局部变量的引用,一旦操作员函数返回,该引用将不再存在。 不要那样做 这是不确定的行为。 只需返回一个rgb值。

暂无
暂无

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

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