我最近开始学习c ++,现在我正在尝试将一个简单的矢量类作为练习。但不知怎的,我的代码似乎不起作用。
ProgressDlg
我使用eclipse作为编辑器,编译时出现此错误:
#include <iostream>
#include <cmath>
class Vec2
{
public:
float x1;
float x2;
Vec2(float a,float b):x1(a),x2(b){}
float norm()
{
return sqrt(x1*x1+x2*x2);
}
Vec2 operator+(const Vec2 &v)
{
Vec2 newv;
newv.x1=this->x1+v.x1;
newv.x2=this->x2+v.x2;
return newv;
}
};
int main()
{
Vec2 v1(3,4);
Vec2 v2(4,5);
Vec2 v3=v1+v2;
std::cout << v1.x1 << std::endl;
std::cout << v1.norm() << std::endl;
std::cout << v3.x1 << std::endl;
return 0;
}
我怀疑运算符重载是罪魁祸首,但我似乎无法让它运行。 任何想法都将受到高度赞赏!
答案 0 :(得分:3)
您的类缺少默认构造函数。只需添加一个即可完成
class Vec2
{
public:
float x1;
float x2;
Vec2() {} // default constructor
};
答案 1 :(得分:1)
问题不在于运营商重载。错误消息将帮助您了解它是构造函数问题。
从this引用,如果您有一个用户定义的构造函数,则该类的默认构造函数不存在。因此,您的程序期望构造函数中的参数,您尚未提供。
修复方法是定义默认构造函数以及已定义的构造函数。这样你就可以使用它们。
Vec2() {}
希望这有帮助!
答案 2 :(得分:0)
您可以创建默认构造函数
Vec2() {}
或者您可以将第15-17行更改为
Vec2 newv(this->x1+v.x1, newv.x2=this->x2+v.x2);
答案 3 :(得分:0)
我们不需要此类的默认构造函数。 这意味着用户无法在没有x,y参数的情况下创建对象。 我认为如果您打算以这种方式使用户,这可能是一个很好的理由。
#include <iostream>
#include <cmath>
class Vec2
{
public:
float x1;
float x2;
Vec2(float a,float b):x1(a),x2(b){}
float norm()
{
return sqrt(x1*x1+x2*x2);
}
Vec2 operator+(const Vec2 &v)
{
float x1=this->x1+v.x1;
float x2=this->x2+v.x2;
Vec2 newv(x1,x2);
return newv;
}
};
int main()
{
Vec2 v1(3,4);
Vec2 v2(4,5);
Vec2 v3=v1+v2;
std::cout << v1.x1 << std::endl;
std::cout << v1.norm() << std::endl;
std::cout << v3.x1 << std::endl;
return 0;
}