您好我已经创建了一个简单的2D坐标类(Point2D),我想为一些基本类型(short,int,double ....)重载这个类的一些基本操作(+ - * /),所以我想我应该使用模板。问题是我得到一些strage数字(我认为这些是类型的最大大小),因为x和y值回来,所以它忽略了我的例如。
Point2D *p = new Point2D(5, 7) //everything works fine here x=5 y=7
Point2D *p = new Point2D(5, 7) + 10;//x= 1.09 * e^-38 same for y but it want x=15 and y=17
这是我的运算符重载函数的定义:
template<class T>
Point2D Point2D::operator+(initializer_list<T> elementList)
{
for (auto elem : elementList)
{
this->x += elem;
this->y += elem;
}
return Point2D(x,y);
}
的行为
Point2D *p = new Point2D(5, 7) + 10;
未定义。右手边被分组为(new Point2D(5, 7)) + 10
,它正在向sizeof(Point2D)
返回的Point2D*
指针添加10个new
!
您不能设置指向您不拥有的内存的指针,除了一个超过数组末尾的内存,或者超过标量地址或nullptr
的内存。
你不能将10
添加到这样的指针。修复它的一种方法是简单地创建Point2D's
作为局部变量:
Point2D p (5, 7);
Point2D q = p + 10;
q
现在将等于15,17
这是假设你创建一个可以采取operator+
的ints
- 你的initializer_list
将不会在这里工作(因为10
不是initializer_list
:
template<class T>
Point2D Point2D::operator+(T e)
{
x += e;
y += e;
return Point2D(x, y);
}