2012-10-17 43 views
2

我只是應該習慣基本的複製構造函數。沒有匹配構造函數用於初始化

我假設我正確放置了拷貝構造函數。

但是,當我嘗試編譯,我不斷收到錯誤「無匹配的構造函數B的初始化」

我有點困惑。

class A { 
    int valuea; 

public:  
    A(const A&); // copy constructor 
    int getValuea() const { return valuea; } 
    void setValuea(int x) { valuea = x; } 
}; 

class B : public A { 
    int valueb; 
public: 
    B(int valueb); 
    B(const B&); // copy constructor 
    int getValueb() const { return valueb; } 
    void setValueb(int x) { valueb = x; } 
}; 

int main() { 
    B b1; 
    b1.setValuea(5); 
    b1.setValueb(10); 
    B b2(b1); 
    cout << "b2.valuea=" << b2.getValuea() << "b2.valueb=" << b2.getValueb() << endl; 

    return 0; 
} 
+2

對於A或B,沒有默認構造函數 - 只要聲明構造函數 - 編譯器將不會生成默認構造函數。 –

+0

如果給'valueb'參數一個默認值,'B(int)'構造函數可以作爲'B'的默認構造函數,從而允許'B b1;'語句工作。然而,'A'沒有構造函數可以調用'B'構造函數,所以'B'依然不能被構造。 –

回答

4

通過聲明B(int)B(const B &),您已禁用一個被隱置於類時,你有沒有其他的構造函數,因爲所有的編譯器知道,你可能不希望一個默認的構造函數的默認構造函數,所以它不能作出假設(see here)。

添加以下B,記住要初始化基和成員與它:

B(){} 

在C++ 11,這個效果很好:

B() = default; 

這將使B有聲明時使用的默認構造函數B b1;

A也是一樣。你有一個拷貝構造函數,所以不再有默認的構造函數爲你隱式地放置。

相關問題