c++中在一個類中定義另一個只有帶參數構造函數的類的對象,編譯通不過
#include<iostream> using namespace std;
class A {
public: A(int i){}
};
class B {
public: B(){}
private:
//A a; //這里當然通不過,沒有可用的構造函數
A a(5); //但是這里也編譯通不過,編譯器居然把此語句當成一個定義一個函數A a()了,郁悶!
};
void main() { B b; }
我現在想在B類的數據成員中定義A類的對象,但是A類中只有帶參數的構造函數,請問如何解決?
改成: #include<iostream>
using namespace std;
class A { public: A(int i){} };
class B {
public: B():a(5)//構造函數初始化子對象 { }
private: //A a; //這里當然通不過,沒有可用的構造函數
A a; //但是這里也編譯通不過,編譯器居然把此語句當成一個定義一個函數A a()了,郁悶!
};
void main()
{ B b; }
注意: 在B中定義 A a; 是可以通過的,但在其他地方(比如函數中)這樣是不對的。 在B中定義 A a; 只是告訴編譯器:“B有一個A類的對象”,並不在定義的時候創建a這個對象成員,也就不考慮它的構造函數。a這個對象成員的創建是在執行B的構造函數時進行的,B的構造函數后面必須以初始化表的形式為a對象成員提供參數,比如 B( ) : a( 1 ) { } 如果在構造函數中不為a提供參數,會發生錯誤。 在其他地方(比如函數中)定義A的對象時,必須定義成 A a(參數);的形式。因為定義時就要創建A的對象,所以要考慮它的構造函數。
你的程序出現錯誤不是因為在B中定義 A a;引起的。
是因為:
1、你定義了A a(5)。 這是不行的,因為此時並不創建A對象,不能為其提供參數。你說“編譯器把此語句當成一個定義一個函數A a()”也是不對的。就是因為這時不能為a提供參數,一定要在B的構造函數中提供!
2、你的程序沒有為B提供一個“可以為a提供參數”的構造函數。 這樣你在主函數中定義B b的時候,就不能初始化它里面的a。
所以,你的代碼應將這兩個錯誤改過來,即寫成如下:
class A
{
public:
A( int i ){}
};
class B {
public:
B():a(1){}
//或:B( int i ):a( i ){ }。對a提供參數一定要按
//這種形式,在冒號后,不能在花括號里面!
private:
A a;
};
void main()
{
B b;
}