我不是最有经验的 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 的副本或引用。
问题:让 Color 使用 Vec 的运算符的最有效/正确的方法是什么?将重载的运算符变成模板函数会解决我的问题(如何?)。还是我应该采取完全不同的方法?我期待得到任何帮助,谢谢。