调用'myclass :: myclass()'没有匹配函数

时间:2014-08-12 12:38:20

标签: c++

我正在编写一个简单的程序来计算区域,我得到的错误是:

  

没有匹配功能可以拨打' myclass::myclass()'

我无法理解此错误的原因以及解决方法。

#include <iostream>
using namespace std;

class myclass{
    int length;
    int breadth;
public:
    myclass(int x, int y);
    int area(int x, int y);
};

myclass::myclass(int x,int y ){
    length=x;
    breadth=y;
}

int myclass::area(int x, int y){
    return x*y;
}

int main()
{
    myclass a;
    a.area(3,4);
}

4 个答案:

答案 0 :(得分:1)

您已经定义了一个构造函数,这意味着编译器不需要为您定义任何构造函数,包括默认构造函数。如果你正在使用C ++ 11,你可以添加:

myclass() = default;

如果不是:

myclass() : length(0), breadth(0) {}

到类声明/正文。

答案 1 :(得分:1)

在本声明中

myclass a;

应该调用类的默认构造函数,但是你没有定义默认的构造函数。

此外,成员函数区域没有重要意义,因为它不计算类的对象区域。

有效代码可能看起来像

#include <iostream>

class myclass
{
private:
   int length;
   int breadth;

public:
   myclass(int x, int y);
   int area() const;
};

myclass::myclass(int x,int y ) : length( x ), breadth( y )
{
}

int myclass::area() const
{
   return length * breadth;
}    

int main()
{
   myclass a(3,4);

   std::cout << "area = " << a.area() << std::endl;
} 

你也可以用以下方式声明构造函数

   myclass( int x = 0, int y = 0 );

在这种情况下,它将是默认构造函数。

答案 2 :(得分:0)

错误是因为没有默认构造函数而您正在尝试调用它。由于您已编写自己的构造函数,因此您已覆盖默认构造函数。一个建议是始终编写默认构造函数,或者在您的情况下,请确保不要调用默认构造函数。

以这种方式更改代码:

#include <iostream>
using namespace std;

class myclass{
    int length;
    int breadth;
public:
    myclass(int x, int y);
    int area(int x, int y);
};

myclass::myclass(int x,int y ){
    length=x;
    breadth=y;
}

int myclass::area(){
    return length*breadth;
}

int main()
{
    myclass a(3,4);
    a.area();
}

答案 3 :(得分:0)

您已为您的班级定义了构造函数。这意味着编译器不会生成默认构造函数,即使您尝试在main中调用它也是如此。有两种解决方案:

从班级中删除自定义构造函数:

myclass(int x, int y);

但是,很可能你需要那个构造函数,所以只需使用你创建的构造函数中的参数来实例化类,如下所示:

int main()
{
    myclass a;
    a.area(3,4);
}

编辑:

我的思绪滑了一下,有第三种解决方案。使用BOTH构造函数。如果您认为您需要实例化该类而不将任何值分配给私有元素,那么这将是最佳解决方案:

public:
    myclass();
    myclass(int x, int y);