错误:没有匹配函数来调用'b :: b()'

时间:2016-02-24 00:18:50

标签: c++

嗨,我刚刚开始用C ++编程,但我遇到了问题。我尝试在另一个班级创建一个班级,但它不起作用......你能帮帮我吗?

这是我的主要内容:

#include <iostream>
#include "a.hpp"
#include "b.hpp"

using namespace std;



int main()
{

return 0;
}

这是我的第一堂课cpp:

#include <iostream>
#include "a.hpp"

using namespace std;

a::a(){} /* The problem is here :error: no matching function for call  
to 'b::b()*/
a::~a(){}

void a::write()
{

cout << "Write a number : " << endl;
cin >> m_number;
}

这是hpp:

#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED

#include "b.hpp"


class a : public b
{
public:
a();
~a();
void write();

protected:
int m_number;
};


#endif // INTERFACE_HPP_INCLUDED

班级b cpp:

#include <iostream>
#include "b.hpp"


using namespace std;
b::b(double c, double d){m_c = c; m_d = d}
b::~b(){}

void b::write1()
{
cout << m_c+m_d<< endl;
}

和hpp:

#ifndef B_HPP_INCLUDED
#define B_HPP_INCLUDED


class b
{
public:
b(double c, double d);
~b();


void writed1();

protected:
double m_c;
double m_d;
};


#endif // B_HPP_INCLUDED

非常感谢你的帮助!!!

2 个答案:

答案 0 :(得分:2)

班级b唯一的构造函数需要两个double参数。

a派生自b,但类a无法使用其两个必需参数及其超类类{{1}调用其超类构造函数},没有默认构造函数。

如果类的构造函数具有必需参数,并且该类没有默认构造函数,并且您从类派生,则派生类负责构造其超类,并使用所需参数调用其构造函数

答案 1 :(得分:1)

当您定义没有构造函数的类时,C ++会为您生成一个默认构造函数。例如,如果我们写一个简单的旧结构&#34;:

struct b {
  int x;
};

然后就好像我们有一个默认的构造函数b(),它什么都不做。这使我们可以写:

b bvar;

但是,当我们引入构造函数时,编译器生成的默认构造函数被抑制:

class b {
public:
   b(int i, double d);
};

这个类只有一个构造函数:b(int, double)。如果不调用此构造函数并传递两个参数,则无法构造对象:

b bvar;  // error: no b::b() function.

即使我们从这个类继承来创建一个具有默认构造函数的派生类a,这仍然是正确的:

class a : public b {
public:
  a();
};

a::a()
{

}

因为我们没有在b构造函数中显式初始化基类a::a(),所以C ++编译器想要使用默认构造来创建对象的b部分。但是,唉,b没有默认构造函数!

有两种方法可供选择。一种是在a构造函数中添加显式语法,以初始化b的{​​{1}}部分,如下所示:

a

这个C ++的特殊基础/成员初始化语法,您可以在构造函数中使用它来指定成员和基础对象的初始化方式;通过这种方式,您可以传递它们所需的构造函数参数。

第二个解决方案是向a() : b(0, 3.5) { } 添加默认构造函数,或者修改其现有构造函数,使其可以作为默认构造函数。让我们采取第二种方法:

b

我们所做的是为两个参数赋予默认值,使它们成为可选的。因为class b { public: b(int i = 0, double d = 0.0); }; 构造函数现在可以被调用为b(int, double)而没有参数,所以它满足了对默认构造函数的需求。

顺便说一句,可以为基础和成员指定多个初始值设定项。初始化按照定义它们的顺序进行,而不是按照初始化程序的写入顺序进行:

b()

这也说明了在程序文本中布置这些初始值设定项的不错方法,左侧的冒号和逗号就好像它们是前缀一样。

只要有可能,就应该以这种方式初始化成员,而不是将其留给默认初始化并用构造函数体中的赋值覆盖。