c ++类构造中的奇怪错误

时间:2017-05-17 09:22:53

标签: c++ class vector overloading

我最近开始学习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;
}

我怀疑运算符重载是罪魁祸首,但我似乎无法让它运行。 任何想法都将受到高度赞赏!

4 个答案:

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

enter image description here