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()
我的指针有一些问题,我不确定我是否搞砸了。
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()