2015-10-26 90 views
1
#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在C++中初始化派生类参数

+1

将您的成员变量与构造函数参数的名称相同称为非常令人困惑。 – mathematician1975

+3

似乎编译 - https://ideone.com/NDeV0o –

+2

@ mathematician1975我不同意。我没有看到问题。 – juanchopanza

回答

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++编译器进行编译。

至于此错误消息

'B':可用

没有合适的默认构造函数,然后B类确实没有默认构造函数。但你可以例如重新定义它的构造你还没有在B构造提供的默认参数如下方式

B(int d = 0) :d(d) 
    { 
     std::cout << "Constructeur de B(int) \n"; 
     std::cout << "d = " << d<< std::endl; 
    }   
0

,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) { 
2

您的代码编译罚款。 如果你想打电话B的构造与只给d,你应该写一个构造它:

public: B(int d) :d(d){...} 

,并调用构造函数B b(1);例如。但是你的编译器说:

“B”:可用

没有合适的默认构造函数,因此,您必须调用构造函数B这样的:B b;这是一样的B b = B()(明确)。它调用默认的构造函数,如果没有给出构造函数,则由编译器自动生成。你给了一个,这样你就可以,或者更优雅写默认构造函数,强制编译器生成它(C++ 11):

B() = default; 

如果你在一个容器中使用B,容器可以调用B的默认构造函数。

您不必对A做同样的事情,因为它已经有一个默认的构造函数。