【问题标题】:c++ Pointer doesn't stay after leaving scopec ++指针在离开范围后不保留
【发布时间】:2018-04-08 20:31:40
【问题描述】:

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

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

所以输出是: 真实地址: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;
}

【问题讨论】:

  • 拥有零碎的代码是没有帮助的。请发帖minimal reproducible example
  • &amp;somethingThatIsAPointer 是指针的地址,而不是指针的值。
  • getX 返回副本而不是引用。
  • 这里&amp;bObj.getX().pointerToAType你不应该取消引用bObj和bObj.getX().pointerToAType应该打印地址。
  • 尝试添加一个最小的完整可验证示例。

标签: c++ oop pointers abstract


【解决方案1】:

问题在于类B方法X getX();返回对象X的副本,这意味着每次调用bObj.getX()时,都会提供新的X对象。如果在这些重新调整的对象之一中设置了某些内容,则无关紧要,因为下一次将返回带有原始值的新对象。

X getX()方法需要返回引用X&amp; getX()

【讨论】:

    【解决方案2】:

    您的getX 方法按值返回,因此您在B 中获得了X 的副本。您需要返回对X 的引用。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2019-08-08
      相关资源
      最近更新 更多