【问题标题】:subclassing with operator overloading c++使用运算符重载c ++进行子类化
【发布时间】:2013-07-13 23:26:02
【问题描述】:

我不是最有经验的 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.
};

为了彻底,我在 main 中这样做:

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

【问题讨论】:

  • Color 是否应该有四个从 Vec 继承的组件,并且还有四个来自成员变量 col 的组件?
  • 除了我的第一条评论之外,您似乎在需要协变返回类型方面遇到了问题,但 C++ 不是一种可以做到这一点的语言。您将不得不考虑模板。
  • @DarenW - 对于第一条评论,不 - 但我认为你只是指出了我的逻辑错误。我希望 Color 的功能类似于我的向量 Vec,对 col 的前三个分量执行的所有代数运算......我知道这是不可能的,因为 Vec 中的运算符是为三个分量定义的,因此我倾向于模板功能,但非常不确定......
  • @DarenW - 我对如何使用模板有基本的了解,我过去也有,但这个问题完全让我不知所措。我发现这个特定问题的语法示例很少,即 - 如何将运算符重载为模板+继承?
  • 正如 DarenW 指出的那样,您既是从 vec 派生的,又是包含一个实例作为成员的。你如何在 vec 类中存储你的值?这可以帮助我们帮助您在颜色类中实现第四个参数。我在这里看不到模板有任何用处。

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


【解决方案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;

【讨论】:

  • 感谢您的回答。我对这个解决方案有几个问题要完全理解它。为什么 operator+ 现在是友元函数?为什么两个论点而不是一个?而且,我从来没有使用过 typedef - 这是做什么的?
  • 这是实现operator+的另一种方式,在我的例子中它是Vector的外部函数。 typedef 只是为类型引入新名称。在它之后你可以写“Vectord3d var1, var2; Color var_for_color1;/*etc*/”
  • 好的,知道了。谢谢你。我现在正在测试。
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 2021-05-14
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多