簡體   English   中英

C ++無法從向量訪問對象

[英]C++ Trouble accessing an object from a vector

我是C ++的新手,所以這可能是一個簡單的問題。 我有一個在Predictor類中聲明的向量向量:

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);
};

在Predictor :: addBit中,我有以下幾行:

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

這給了我兩個不同的地址,我希望得到相同的地址。 我做了什么骨頭錯誤?

這使得BitCounter副本:

BitCounter bit_counter = data[i][j];

這里, bit_counterdata[i][j]的任何內容的副本,因此具有不同的地址。

如果要引用嵌套向量中的元素,可以使用引用:

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

這里, bit_counterdata[i][j]任何別名,因此address-of運算符將為兩者產生相同的地址:

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

這是兩個截然不同的對象。 &bit_counter是局部變量的地址,其中&data[i][j]Vector內對象的地址。

BitCounter bit_counter = data[i][j]; 表示“使用data[i][j]的值構造一個新的BitCounter對象”。 這個和new BitCounter(data[i][j])之間的主要區別(與Java / C#中發生的事情有點類似)是在我們的例子中,對象的生命周期受變量范圍的限制 -即,當前塊。

因此,如果您希望獲得與Java類似(但不相同)的行為,則應使用指針類型,這使得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的賦值(如果它不是常量)將更改引用的對象本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM