2013-06-21 91 views
0


在下面的例子中,如何在另一個類中創建一個類的參數化構造函數作爲數據成員?

class Car 
{ 
     private: 
       int sides; 

     public: 
       Car() 
       { 
         cout<<"\ndefault called constructor"; 
       } 
       Car(int nsides) 
       { 
         cout<<"\ncalled constructor"; 
         sides=nsides; 
       } 

}; 

class Auto 
{ 
     private: 
       Car ch; 
     public: 
     Auto(int a) : Car(a) 
     { 

       //Car test(5); 
     } 
}; 

int main() 
{ 
     Auto at(5); 
     return 0; 

} 

參考下面的鏈接後: -

create objects in object passing variables through constructor

http://www.cplusplus.com/forum/beginner/9746/

我試着寫相同,執行it.unfortunately我得到以下編譯器錯誤: -

check.cpp: In constructor ‘Auto::Auto(int)’: 
check.cpp:44: error: type ‘Car’ is not a direct base of ‘Auto’ 

如果給出的鏈接中提到的解決方案是正確的,那麼我的代碼有什麼問題?我的下一個查詢是...爲什麼只有參數化構造函數()會拋出編譯器,如果嘗試初始化它而不使用初始化列表。
這將引發編譯器錯誤: -

class Auto 
{ 
     private: 
       Car ch(5); 
     public: 
     Auto(int a) 
     { 

     } 
}; 

但這並不: -

class Auto 
{ 
     private: 
       Car ch; 
     public: 
     Auto(int a) 
     { 

     } 
}; 

請幫助我理解這種行爲。
在此先感謝。

回答

3

在你的例子中,你通過構造函數Auto(int a) : Car(a)指定Auto是從Car派生的,這就是編譯器所抱怨的。

要初始化您的Car對象(Auto內部),請執行此操作Auto(int a) : ch(a)。你把類型而不是成員的名字。

關於你的第二個問題,類內成員初始化是C++ 11帶來的一個新特性。您可以通過將參數-std=c++11添加到您的編譯器(GCC或Clang,msvc不支持它)來使用它。請參閱this question。在你的情況下,你可以使用它作爲克里斯指出:

class Auto { 
// ... 
Car ch{5}; 
int someVal = 5; 
// ... 
}; 
+0

即使如此,你不能做'汽車ch(5);',你需要'車ch {5};'。 – chris

+0

@chris權利,編輯我的答案。 –

+0

但我被允許執行以下操作: - 'private:' 'Car ch;' 那麼爲什麼編譯器不會爲這種情況拋出錯誤(不使用-std = C++)? – user1057741

相關問題