错误:调用'b::b()'没有匹配函数
error: no matching function for call to 'b::b()'
嗨,我刚刚开始用C++编程,但我有一个问题。我尝试在另一个类中创建一个类,但它不起作用......你能帮我吗?
这是我的主要:
#include <iostream>
#include "a.hpp"
#include "b.hpp"
using namespace std;
int main()
{
return 0;
}
这是我的第一堂 A 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
非常感谢您的帮助!!
>类b
唯一的构造函数采用两个double
参数。
类 a
派生自 b
,但是类 a
无法使用其两个必需参数调用其超类的构造函数,并且它的超类类 b
没有默认构造函数。
并且您从该类派生,则派生类负责构造其超类,并使用所需的参数调用其构造函数。
定义没有构造函数的类时,C++会为您生成默认构造函数。例如,如果我们写一个"普通的旧结构":
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()
{
}
由于我们没有在 a::a()
构造函数中显式初始化基b
,因此C++编译器希望使用默认构造来创建对象的b
部分。但是,唉,b
没有默认构造函数!
有两条出路。一种是在a
构造函数中添加显式语法来初始化a
的b
部分,如下所示:
a() : b(0, 3.5)
{
}
这C++特殊的基/成员初始化语法,您可以在构造函数中使用它来指定成员和基对象的初始化方式;通过此操作,您可以向它们传递所需的构造函数参数。
第二种解决方案是将默认构造函数添加到b
,或者修改其现有构造函数,使其可以充当默认构造函数。让我们采用第二种方法:
class b {
public:
b(int i = 0, double d = 0.0);
};
我们所做的是为这两个参数提供默认值,使它们成为可选的。由于现在可以调用b(int, double)
构造函数,因此可以调用没有参数的b()
,因此它满足了对默认构造函数的需求。
顺便说一下,可以为基和成员指定多个初始值设定项。初始化按定义这些的顺序进行,而不是按照编写初始值设定项的顺序进行:
class foo : public bar {
xyzzy xy;
int count;
public:
foo(const string &arg)
: bar(arg) // let's assume the base constructor takes a string
, xy(42, 9) // class xyzzy has a constructor that takes a pair of integers
, count(0) // member, initialized to zero.
{
}
}
这也说明了在程序文本中布置这些初始值设定项的不错方法,冒号和逗号在左侧,就好像它们是前缀一样。
只要有可能,成员就应该以这种方式初始化,而不是留给默认初始化,并在构造函数主体中被赋值覆盖。
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销