在C ++

时间:2015-10-26 20:55:32

标签: c++

#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

3 个答案:

答案 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) {