使用运算符重载c ++进行子类化

时间:2013-07-13 23:26:03

标签: c++ templates design-patterns operator-overloading raytracing

我不是最有经验的C ++程序员,也不是这个论坛的新手。 我希望第一篇文章遵循规则。

我的目标是编写一个简单的光线跟踪器,但我仍然坚持如何扩展我的一个类。 问题在于运算符重载,还有设计模式(我认为)。这是我的代码:

    class Vec{ //My vector class
        protected:
            double v[4]; //Fourth element not used...
        public:
            Vec();
            Vec (double i, double j, double k);

            Vec  operator+ (const Vec& vec) const;
            Vec  operator- (const Vec& vec) const;
            Vec & operator+=(const Vec& vec);
            Vec & operator-=(const Vec& vec);
            double operator*(const Vec& vec) const;
            Vec operator*(double scalar);
            //get operator
            double& operator[](unsigned int i);
            double operator[](unsigned int i) const;
            //Vector assignment operator
            Vec Vec::operator=(const Vec& vec);
            //Scalar assignment operator
            Vec Vec::operator=(double scalar);
    };

Vec Vec::operator+(const Vec& vec) const{
    return Vec(v[0]+vec.v[0], v[1]+vec.v[1], v[2]+vec.v[2]);
}

class Color : public Vec{
    protected:
        Vec col; //A Color should use all four elements in the array
                 //I.e Vec color(R,G,B,specular);
    public:
        //Vec Color::operator+(const Vec& vec) const; <-- this is wrong i know.
};

为了彻底,我主要是这样做的:

Color myColor(1.2, 1.3, 2.3, 40);
Color myColor2(2.2, 3.4, 3.3, 30);
cout << (myColor+myColor2) << std::endl;

程序调用Vec()默认构造函数返回(0,0,0)的输出,这显然是错误的....

编辑:Vec类存储像这样的值

Vec::Vec () {
    v[0] = 0; v[1] = 0; v[2] = 0;
}
Vec::Vec (double i, double j, double k) {
    v[0] = i; v[1] = j; v[2] = k;
}

所有重载的运算符都在double v[4]上运行,并返回Vec的副本或引用。

问题:使用Vec中的运算符最有效/最合适的方法是什么?将重载的运算符转换为模板函数会解决我的问题(如何?)。或者我应该采取一种完全不同的方法?我期待着能得到任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

为什么不是这样的:

#include <cstddef>

template <size_t N>
class Vector {
public:
  Vector();
  friend Vector operator+(const Vector& lh, const Vector& rh);
//...
private:
  double val[N];
};

typedef Vector<3> Vector3d;
typedef Vector<4> Color;