带模板和重载的 3D 矢量加法(+运算符和 += 运算符)

3D Vector addition with Template and Overloading (+operator and += operator)

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)。 我不知道如何进一步。

我在互联网上搜索其他解决方案,但没有人使用 +operator 和 +=operator。

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

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

中无效使用 'this'

你的代码错误太多。

先别用using namespace std;

第二个为什么 return 类型的运算符是 A。他们应该是 vector3d_add<A>!

这是一个工作代码:

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

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

用法:

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

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

鉴于此,与其开始写 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 创建一个临时副本,然后在临时副本上调用 +=。然后那个结果是 returned.