#include <iostream>
class A {
int x, y;
public:
A(int _x = 0, int _y = 0) : x(_x), y(_y) {
std::cout << "Constructeur de A \n";
std::cout << "x = " << x << ", y= " << y << std::endl;
}
};
class B : A {
int d;
public: B(int x, int y, int _d=2) : A(x,y), d(_d) {
std::cout << "Constructeur de B \n";
std::cout << "d = " << d<< std::endl;
}
};
所以我有上面的代码,不能编译。我的问题是为什么我不能初始化d
而不需要初始化Base
类参数?它就像是说我不能允许用户只提供d
的值并使用基类默认参数(我发现它多余来再次初始化基类参数,会产生感觉如果我想将默认值更改为其他内容)。错误消息并没有告诉我'B': no appropriate default constructor available
。
答案 0 :(得分:2)
您的代码编译得很好。
如果您希望仅使用B
来调用d
的构造函数,则应为其编写构造函数:
public: B(int d) :d(d){...}
例如,使用B b(1);
调用构造函数。但是你的编译器说:
&#39; B&#39;:没有合适的默认构造函数
因此,你必须像B
那样调用B b;
的构造函数:B b = B()
与B() = default;
(显式)相同。它调用默认构造函数,如果没有给出构造函数,它将由编译器自动生成。你给了一个,所以你可以编写默认的构造函数,或者更优雅的是,强制编译器生成它(C ++ 11):
B
如果您在容器中使用B
,容器可能会调用A
的默认构造函数。
您不必对string signature = GenerateSignature(endPoint, endPointParameters, instagram_ClientSecret);
执行相同的操作,因为它已经有一个默认构造函数。
答案 1 :(得分:1)
如果要删除拼写错误并添加一个带有一个B类参数的构造函数,那么代码就会成功编译
#include <iostream>
class A {
int x, y;
public:
A(int x = 0, int y = 0) : x(x), y(y) {
std::cout << "Constructeur de A \n";
std::cout << "x = " << x << ", y= " << y << std::endl;
}
};
class B : A {
int d;
public:
B( int d ) :d( d )
{
std::cout << "Constructeur de B( int ) \n";
std::cout << "d = " << d<< std::endl;
}
B(int x, int y, int d=2) : A(x,y), d(d)
{
std::cout << "Constructeur de B( int, int, int ) \n";
std::cout << "d = " << d<< std::endl;
}
};
int main()
{
B b( 1 );
return 0;
}
它的输出是
Constructeur de A
x = 0, y= 0
Constructeur de B( int )
d = 1
A类具有默认构造函数。它唯一明确定义的构造函数是类的默认构造函数。
该代码还使用在线MS C ++编译器进行编译。
至于此错误消息
&#39; B&#39;:没有合适的默认构造函数
然后B类确实没有默认构造函数。但是你可以通过以下方式重新定义它的构造函数
B( int d = 0 ) :d( d )
{
std::cout << "Constructeur de B( int ) \n";
std::cout << "d = " << d<< std::endl;
}
答案 2 :(得分:0)
您没有在B
构造函数中提供默认参数,C ++不会根据您的使用方式猜测它们。给他们默认值:
B(int x = 0, int y = 0, int _d = 0): A(x, y), d(_d) {
或提供另一个真正的默认构造函数:
B(int _d = 0): A() /*will use A(x=0,y=0)*/, d(_d) {