Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用运算符重载c+进行子类化+; 我不是这个论坛最有经验的C++程序员和新手。 我希望第一篇文章遵循规则_C++_Templates_Design Patterns_Operator Overloading_Raytracing - Fatal编程技术网

使用运算符重载c+进行子类化+; 我不是这个论坛最有经验的C++程序员和新手。 我希望第一篇文章遵循规则

使用运算符重载c+进行子类化+; 我不是这个论坛最有经验的C++程序员和新手。 我希望第一篇文章遵循规则,c++,templates,design-patterns,operator-overloading,raytracing,C++,Templates,Design Patterns,Operator Overloading,Raytracing,我的目标是编写一个简单的光线跟踪器,但我一直在研究如何扩展我的一个类。 问题在于运算符重载,但也在于设计模式(我认为)。这是我的密码: class Vec{ //My vector class protected: double v[4]; //Fourth element not used... public: Vec(); Vec (double i, double j, doub

我的目标是编写一个简单的光线跟踪器,但我一直在研究如何扩展我的一个类。 问题在于运算符重载,但也在于设计模式(我认为)。这是我的密码:

    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]);
}

所有重载运算符都在双v[4]上工作,并返回一个Vec副本或引用


问题:使颜色利用Vec运算符的最有效/最恰当的方法是什么?将重载运算符转换成模板函数是否可以解决我的问题(如何解决?)。还是我应该采取完全不同的方法?我期待着能得到任何帮助,谢谢

为什么不这样做:

#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;
#包括
模板
类向量{
公众:
向量();
友元向量运算符+(常数向量和左、常数向量和右);
//...
私人:
双val[N];
};
typedef矢量3d;
矢量颜色;

颜色是否应该有四个从VEC继承的元素,并且还有一个成员变量COL中的四个?除了我的第一个注释之外,看起来你需要一个协变返回类型的问题,但是C++不是一个语言。你必须考虑模板。@ DARENW-对于第一个评论,没有-但是我想你刚才指出了我的逻辑中的一个错误。我希望颜色的功能类似于我的向量向量,所有对颜色前三个分量执行的代数运算。。。我知道这是不可能的,因为Vec中的运算符是为三个组件定义的,例如我倾向于模板功能,但非常不确定…@DarenW-我对如何使用模板有基本的了解,我过去有过,但这个问题完全困扰着我。对于这个特定的问题,我发现很少有语法示例,例如-如何将运算符重载为模板+继承?正如DarenW指出的,您都是从vec派生的,并且包括一个实例作为成员。如何在vec类中存储值?这可能有助于我们帮助您在颜色类中实现第四个参数。我不认为模板在这里有任何用处。谢谢你的回答。我有几个关于这个解决方案的问题来完全理解它。为什么运算符+现在是友元函数?为什么两个论点而不是一个?而且,我从来没有使用过typedef-这是做什么的?这是实现操作符+,在我的例子中是向量的外部函数的另一种方法。typedef只是为type引入新名称。在它之后,你可以写“Vectord3d var1,var2;Color varu for_color1;/*etc*/”好的,明白了。非常感谢。我现在正在测试这个。
Color myColor(1.2, 1.3, 2.3, 40);
Color myColor2(2.2, 3.4, 3.3, 30);
cout << (myColor+myColor2) << std::endl;
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;
}
#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;