2013-05-05 112 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