c ++指针在离开范围

时间:2018-04-08 20:31:41

标签: c++ oop pointers abstract

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

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

2 个答案:

答案 0 :(得分:2)

您的getX方法按值返回,因此您可以获得XB的副本。您需要返回对X

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

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

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

答案 1 :(得分:2)

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

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