2014-01-25 34 views
0

對於一個assigment,我必須實現一個C++構造函數,它以另一個類的對象數組作爲參數。我無法理解以下:請幫我理解這個基本的C++類實現

A.H:

class a { 
public : 
    a(const b &bb); 
private : 
    b bb_[10]; 
}; 

a.cc:

#include "a.h" 
#include "b.h" 
a::a(const b &bb) { 
    *bb_ = bb; 
} 

看來工作,但是這是怎麼回事呢?目標是將bb_初始化爲b類10個對象的數組。 b類有一個默認的構造函數。

謝謝!

+1

哪個特定部分不清楚?爲了回答這個問題,我們必須知道哪一部分你不明白。 –

+0

你在這裏做什麼:傳遞一個參數(引用)的單個對象,然後將一個ob對象拷貝到bb_ [0](除非b有一個非拷貝拷貝構造函數)。陣列中的其他9個位置仍未使用。 – deviantfan

+0

這裏沒有初始化。 –

回答

0

上面的代碼可以編譯,但我不確定邏輯是否正確。

你看,行*bb_ = bb;只有填充數組的第一個元素。當你將一個指針引用到一個數組時,你會得到它的第一個元素(在索引0處)。

你想要做的是填補了整個陣列,而不只是第一個元素:

const int SIZE = 10; // please use constants for array sizes 

class a { 
public : 
    a(const b (&bb)[SIZE]) ; 
private : 
    b bb_[SIZE]; 
}; 

a::a(const b (&bb) [SIZE]) { 
    for (int i = 0; i < SIZE; i++) 
     bb_[i] = bb[i]; 
} 

如果你不喜歡在構造函數中的循環,你可以使用memcpy()功能會從字面上bb複製字節的內存到您的數組:

a::a(b (&bb) [SIZE]) { 
    memcpy(bb, bb_, sizeof(bb)); 
} 

另一種方法是使用更安全的替代方法:std::array

#include <array> 

const int SIZE = 10; 

class a { 
public : 
    a(std::array<b, SIZE> bb); 
private : 
    std::array<b, SIZE> bb_; 
}; 

a::a(std::array<b, SIZE> bb) { 
    bb_ = bb; 
} 
+0

謝謝。我的印象是,我可以將內部數組bb_的「地址」更改爲bb(參數)中的一個。 – user3020233

+0

@ user3020233通過取消引用(使用'*'),您無法訪問地址。相反,您可以直接訪問其參考元素。 'bb_'是一個指向數組的指針,'* bb_'是'bb_'指向的數組的第一個元素。 – Oleksiy

+0

如果bb_是一個指向數組的指針,是不是可以改變它,所以它指向數組bb呢?我嘗試了一切,但無法弄清楚如何做到這一點。謝謝。 – user3020233

0

*bb_只是bb_[0]這樣的a構造是僅僅複製指定b其內部的10 b陣列的第一個單元。

如果你想在所有的內部數組bb_的10個細胞複製bb,做到這一點:如果你要的10 b數組複製到內部數組bb_

std::fill(bb_, bb_ + 10, bb); 

,你需要聲明參數bb作爲構造這樣一個數組:

a::a(b bb[10]) { 
    std::copy(bb, bb + 10, bb_); 
} 

最後,如果你要複製的10 b到數組的地址,然後bb_應該簡單地定義爲指針,並在構造函數中指定的參數bb應該改變,以及成爲一個指針:

啊:

class a { 
public : 
    a(const b* bb); 
private : 
    const b* bb_; 
}; 

a.cc:

#include "a.h" 
#include "b.h" 
a::a(const b* bb) { 
    bb_ = bb; 
} 
+0

對不起,我應該更具體。我試圖讓內部數組bb_指向在參數列表(bb)中傳遞的數組。沒有辦法將bb_的地址更改爲bb而不復制所有數組元素? – user3020233

+0

然後'bb_'應該是一個不是數組的指針。 – user3146587