c ++指针在离开范围后不会保留

c++ Pointer doesn't stay after leaving scope

我的指针有一些问题,我不确定我是否搞砸了。

Class A{
...
}

Class B: public A{
...
X xInfo;
X getX();
}

Class X{
...
A *pointerToAType;
void setPointer(A *point);
}

所以我有一个 B 对象的实例化。

我有代码:

cout << "True Address: " << &bObj;
cout << "Address one: " << &bObj.getX().pointerToAType;
bObj.getX().setPointer(&bObj);
cout << "Address four: " << &bObj.getX().pointerToAType;

setPointer代码为:

X::setPointer(A *pointer){
    cout << "Address two: "<< pointerToAType;
    pointerToAType = pointer;
    cout << "Address three: "<< pointerToAType;
}

所以输出是: 正确 Address:0xABCDEF 地址一:0 地址二:0 地址三:0xABCDEF 地址四:0

所以看起来好像我在方法内部成功更新了指针,但是一旦我离开方法,指针就失效了。 我对为什么会发生这种情况以及如何强制指针保持指向感到困惑。

我想我正确地传递了地址的位置,并正确地设置了它,所以它应该保留。但是我的指点有点薄弱。

最小示例 ?:

//main.cpp
main(){
    B bObj;
    cout << "True Address: " << &bObj;
    cout << "Address one: " << &bObj.getX().pointerToAType;
    bObj.getX().setPointer(&bObj);
    cout << "Address four: " << &bObj.getX().pointerToAType;
}

//b.cpp
B::getX(){return xInfo;}

//x.cpp
    X::setPointer(A *pointer){
    cout << "Address two: "<< pointerToAType;
    pointerToAType = pointer;
    cout << "Address three: "<< pointerToAType;
}

您的 getX 方法是按值 returning 的,因此您会在 B 中获得 X 的副本。您需要 return 对 X.

的引用
Class B: public A{
    ...
    X xInfo;
    X& getX();
  // ^ Return reference
}

此外,打印指针时不应使用 &。你要打印指针的值,而不是指针的地址。

cout << "Address one: " << bObj.getX().pointerToAType;
                       // ^ No & here

问题是在classB方法中X getX();return复制对象X,也就是说每次bObj.getX()被调用,提供了新的 X 对象。如果在这些重新调整的对象之一中设置了某些内容,那没关系,因为下一次新对象 return 使用原始值编辑。

X getX()方法需要return参考X& getX()