2015-10-26 57 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做同樣的事情,因爲它已經有一個默認的構造函數。