带模板和重载的 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.
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->在非成员函数
你的代码错误太多。
先别用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.