我觉得我错过了一些有关引用和指针的关键概念;我有这样的代码
#include "stdio.h"
struct bar {};
class foo {
public:
foo(){
barPtr = new bar();
};
bar* barPtr;
bar*& getBarPtr() {
return barPtr;
};
};
int main() {
foo fObject;
bar* b = nullptr;
b = fObject.getBarPtr();
printf("B before updates %p\n", b);
printf("barPtr before b updates %p\n", fObject.barPtr);
b = new bar();
printf("B after updates %p\n", b);
printf("barPtr after b updates %p\n", fObject.barPtr);
return 0;
}
输出为
b before updates 0x55db559ace70
barPtr before b updates 0x55db559ace70
b after updates 0x55db559ad2a0
barPtr after b updates 0x55db559ace70
我想要实现的是通过使用barPtr
来更改b
指向的内容,因此我使getBarPtr
函数返回了barPtr
的引用。我不明白的是为什么更改b
不会更改barPtr
。
答案 0 :(得分:4)
将b
的定义更改为:
bar*& b = fObject.getBarPtr();
您当前正在做的是将fObject
的指针复制到b
中:它们是两个独立的对象。它们具有相同的值(指向您在bar
的构造函数中创建的foo
对象的地址),但是它们彼此无关。因此,如果您为b
分配一个新值,则将覆盖它,而不会更改fObject
的{{1}}。
答案 1 :(得分:0)
b
和barPtr
是指向内存中同一对象的两个指针。一旦为b
分配了新值,就意味着它将指向另一个对象-如您所见,它不会接受barPtr
。
如果您修改了对象本身(例如,进行了barPtr->modifyMyData()
之类的操作),那么您将从两个指针中看到修改后的值。
答案 2 :(得分:0)
您为什么认为通过更改指针变量b来更改类实例? 您不会以这种方式更改它。
您分配了两个不同的指针变量,一个在foo类中,一个在外部:b;
您可以使用指向指针的指针。并将引用返回给类的指针,然后更改该引用的内容。