c++中在一個類中定義另一個只有帶參數構造函數的類的對象


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;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM