【问题标题】:3D Vector addition with Template and Overloading (+operator and += operator)带有模板和重载的 3D 矢量加法(+运算符和 += 运算符)
【发布时间】:2021-01-20 13:54:06
【问题描述】:
using namespace std;

template <typename A>
class vector3d_add
{
    public:
            vector3d_add(A x, A y, A z);
            virtual ~vector3d_add();
            void setX(A x);
            void setY(A y);
            void setZ(A z);
            void display();
                  A getX();
                  A getY();
                  A getZ();
            A operator+ (const A& v2);
            A& operator+= (const A& v2);

    private:
             A x;
             A y;
             A z;
};


template <typename A>
vector3d_add<A>::~vector3d_add()
{
    cout << "deleted" << endl;
}

template <typename A>
vector3d_add<A>::vector3d_add(A x, A y, A z)
{
    this->x = x;
    this->y = y;
    this->z = z;
}

template <typename A>
A& operator+=(const A& v2) //x1
{
    this->x += v2.x;
    this->y += v2.y;
    this->z += v2.z;
    return *this;
}

template <typename A>
A operator+(const A& v2)
{
    return A(*this) += v2; //x2
}

template <typename A>
void vector3d_add<A>::display()
{
    cout<<this->x<<endl<<this->y<<endl<<this->z<<endl;
}

int main()
{
    VECTOR<int>v1(10,10,10);
    VECTOR<int>v2(10,10,10);
    VECTOR<int>v3=v2+v1;

    v3.display();
}

我想实现一个代码,它可以添加带有模板和运算符重载的 3D 向量(必须使用 +operator 和 +=operator)。 我不知道如何进一步。

我在互联网上搜索了其他解决方案,但 nodody 使用的是 + 运算符和 += 运算符。

我尝试了其他的方法来实现它,但我不明白。

错误:
x1->'A& operator+=(const A&)' 必须正好有两个参数 x2->在非成员函数中无效使用'this'

【问题讨论】:

  • 我在互联网上搜索了其他解决方案,但 nodody 正在使用 +operator 和 +=operator。 -- 你真的搜索得不够努力,因为几乎所有使用+ 的编写良好的代码都同时重载了++=。提示——首先写operator +=,而不是operator +。然后从那里开始工作。
  • 感谢您的快速回答,但我真的不知道如何对 += 运算符进行编程,如果可行的话,我需要有人可以检查我的代码。
  • I need someone who can check my code, if it would work.// Dontknow how to do this overloading 不要解释你的问题是什么。构建时是否收到错误消息?您在// Dontknow how to do this overloading 尝试过什么?
  • 我很确定 glmEigen 和其他的 vec3 实现都使用`+=operator`和+operator
  • 还有这个问题What are the basic rules and idioms for operator overloading? 和这个answer二元算术运算符 部分带有operator +operator += 的示例。

标签: c++ templates vector 3d operator-overloading


【解决方案1】:

首先operator +的返回值应该是vector3d_add&amp;,而不是A。鉴于您编写的函数的主体,可以假设您正在尝试更改现有的 vector3d_add&lt;T&gt; 对象。

鉴于此,与其一开始写operator +,不如先写operator +=。写完之后,你就可以把operator +写成operator +=

template <typename A>
class vector3d_add
{
    public:
            vector3d_add(A x, A y, A z);
            virtual ~vector3d_add();
            void setX(A x);
            void setY(A y);
            void setZ(A z);
            void display();
                  A getX();
                  A getY();
                  A getZ();
            vector3d_add<A>& operator+=(const vector3d_add<A>& v2);
            vector3d_add<A> operator+(const vector3d_add<A>& v2);

    private:
             A x;
             A y;
             A z;
};

template <typename A>
vector3d_add<A>& vector3d_add<A>::operator+=(const vector3d_add<A>& v2)
{
    x += v2.x;
    y += v2.y;
    z += v2.z;
    return *this;
}

template <typename A>
vector3d_add<A> vector3d_add<A>::operator+(const vector3d_add<A>& v2)
{
    return vector3d_add(*this) += v2;
}

operator + 只是从this 创建一个临时副本,然后在临时副本上调用+=。然后返回该结果。

【讨论】:

  • 错误:A& operator+=(const A&)' 必须正好有两个参数,并且在 A operator+的非成员函数中无效使用 'this'
  • 虽然答案是正确的,但实际问题可能是 OP 显示的代码中 operator+= 的定义在类之外,但没有 vector3d_add&lt;A&gt;::。但是这个问题忽略了实际问题的细节。
  • 也试过了,只是出现了更多错误。我更新了我的代码并粘贴了错误。
【解决方案2】:

您的代码中有太多错误。

首先不要使用using namespace std;

第二个为什么运算符的返回类型是A。他们应该是vector3d_add&lt;A&gt;

这是一个工作代码:

template <typename A>
class vector3d_add
{
public:
    vector3d_add(A x, A y, A z);
    virtual ~vector3d_add();
    void setX(A x);
    void setY(A y);
    void setZ(A z);
    void display();
    A getX();
    A getY();
    A getZ();
    vector3d_add operator+ (const vector3d_add& v2);
    vector3d_add& operator+= (const vector3d_add& v2);

    private:
             A x;
             A y;
             A z;
};


template <typename A>
vector3d_add<A>::~vector3d_add()
{
    std::cout << "deleted" << std::endl;
}

template <typename A>
vector3d_add<A>::vector3d_add(A _x, A _y, A _z):x(_x),y(_y),z(_z){}

template <typename A>
vector3d_add<A>& vector3d_add<A>::operator+=(const vector3d_add<A>& v2) //x1
{
    x += v2.x;
    y += v2.y;
    z += v2.z;
    return *this;
}

template <typename A>
vector3d_add<A> vector3d_add<A>::operator+(const vector3d_add<A>& v2)
{
    vector3d_add<A> result(*this);
    result.x += v2.x;
    result.y += v2.y;
    result.z += v2.z;
    return result; //x2
}

template <typename A>
void vector3d_add<A>::display()
{
    std::cout<<this->x<<std::endl<<this->y<<std::endl<<this->z<<std::endl;
}

对每个成员应用完全相同的运算符,最后返回自身的引用。

用法:

int main()
{
    vector3d_add<int> a1(1,2,3);
    vector3d_add<int> a2(4,5,6);
    vector3d_add<int> a3 = a1 + a2;
    a1 += a2;
    a1.display();
    a3.display();
    return 0;
}

【讨论】:

  • @Observer101 谢谢你的提问。如果我的回答有帮助,请考虑点击我的回答旁边的勾号接受它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多