你好我已经创建了一个简单的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);
}
答案 0 :(得分:1)
的行为
Point2D *p = new Point2D(5, 7) + 10;
未定义。右侧被分组为(new Point2D(5, 7)) + 10
,这会向sizeof(Point2D)
返回的Point2D*
指针添加10批new
!
您不能设置指向您不拥有的内存的指针,除了一个超过数组末尾的内存,或者超过标量地址的内容,或nullptr
。< / p>
答案 1 :(得分:0)
您无法将10
添加到类似的指针中。修复它的一种方法是简单地创建Point2D's
作为局部变量:
Point2D p (5, 7);
Point2D q = p + 10;
q
现在将等于15,17
假设您创建的operator+
可以ints
- initializer_list
一个人在这里工作(因为10
不是&#39 ; t initializer_list
:
template<class T>
Point2D Point2D::operator+(T e)
{
x += e;
y += e;
return Point2D(x, y);
}