2013-05-05 114 views
3

我是C++新手,所以這可能是一個簡單的問題。我在類預測聲明矢量的矢量:C++無法從矢量訪問對象

class Predictor{ 
    std::vector<std::vector<BitCounter>> data; 
public: 
    Predictor(); 
    void addBit(int x); 
}; 

BitCounter被聲明爲:

class BitCounter { 
    short int count0 = 0; 
    short int count1 = 0; 
public: 
    BitCounter(); 
    short int getCount0(); 
    short int getCount1(); 
    void addBit(int x); 
}; 

在預測:: addBit,我有行:

BitCounter bit_counter = data[i][j]; 
printf("%p %p\n", &bit_counter, &data[i][j]); 

這給了我兩個不同的地址,我期待得到相同的地址。我在做什麼骨頭錯誤?

回答

2

這使得BitCounter副本:

BitCounter bit_counter = data[i][j]; 

這裏,bit_counter是無論是在data[i][j]副本,因此具有不同的地址。

如果你想引用的元素在你的嵌套向量,就可以使用,而不是一個參考:

const BitCounter& bit_counter = data[i][j]; 

這裏,bit_counter是一個別名,無論是在data[i][j],因此地址的運營商將產生兩者的地址相同:

const BitCounter& bit_counter = data[i][j]; 
std::cout << &bit_counter << "\n"; 
std::cout << &data[i][j] << "\n"; 
2

這些是兩個不同的對象。 &bit_counter是本地變量的地址,其中&data[i][j]Vector中對象的地址。

BitCounter bit_counter = data[i][j];表示「使用值data[i][j]構建新的BitCounter對象」。這與new BitCounter(data[i][j])(它與Java/C#中發生的事情更類似)之間的主要區別在於,在我們的例子中,對象的生命週期受變量範圍(即當前塊)的限制。

所以,如果你想獲得類似(但不相同)的行爲去渣,你應該使用指針類型,這使得printf聲明obvoius:

BitCounter* bit_counter = &data[i][j]; 
printf("%p %p\n", bit_counter, &data[i][j]); 

您可以使用引用,作爲這裏建議:

const BitCounter& bit_counter = data[i][j]; 
printf("%p %p\n", &bit_counter, &data[i][j]); 

,但注意,引用不能改變,不同的情況下在Java/C#引用,所以賦值bit_counter(如果不是常數)會改變引用的對象本身。

+0

謝謝!我來自Objective-C,對象總是通過引用傳遞,我看不到明顯的。但是,我從來沒有遇到過任務操作符的左側,所以您的回答讓我更深入地研究了這一點。 – AbleArcher 2013-05-05 23:07:07