2014-01-09 77 views
0

在下面的代碼顯式初始化成員是什麼意思?

class someClassB; 

class someClassA 
{ 
public: 
    someClassA(int x, int y); 
private: 
    someClassB* B; 
}; 

class someClassB 
{ 
public: 
    someClassB(int x, int y); 
private: 
    int x; 
    int y; 
    someClassA A; 
}; 

someClassA::someClassA(int i, int j) 
{ 
    B->x = i; 
    B->y = j; 
} 

someClassB::someClassB(int i, int j) 
{ 
    x = i; 
    y = j; 
    A = new someClassA(i, j); 
} 

爲什麼我得到一個錯誤說「構造‘someClassB’必須明確初始化成員‘’不具有默認的構造函數」 A? 我是不是在someClassB的構造函數中初始化'A'?

回答

5

someClassA沒有默認構造函數。目前,someClassB需要默認初始化它,導致您引用的編譯錯誤。 。您需要使用其可用構造函數之一明確初始化someClassA數據成員。例如,

someClassB::someClassB(int i, int j) : x(i), y(j), A(i, j) 
{ 
} 

這裏,xy在構造函數初始化列表初始化,而不是默認初始化,然後分配值,因爲在你的代碼。

還要注意的是,一般來說,這是沒有意義的C++:

A = new someClassA(i, j); 

new返回一個指針。

4

假設你正在使用Anew,我懷疑你的意思是它聲明爲指針:

someClassA* A; 

如果沒有,那麼你需要在someClassBinitializer list進行初始化。

0
someClassA::someClassA(int i, int j) 
{ 
    B->x = i; 
    B->y = j; 
} 

創建類someClassB的新實例作爲B是一個指針,你沒有這個分配的內存。

A = new someClassA(i, j); 

A不是指針這是someClassA

一個實例