oop — c ++ Pointer не остается после выхода из области видимости

У меня есть некоторые проблемы с моими указателями, и я не уверен, что я что-то напортачу.

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

-1

Решение

Проблема в том, что в классе B метод X getX(); вернуть копию объекта X, что означает, что каждый раз bObj.getX() называется, новый X объект предоставляется. Если что-то установлено в одном из этих перенастроенных объектов, это не имеет значения, потому что в следующий раз новый возвращается с исходным значением.

X getX() метод должен возвращать ссылку X& getX()

2

Другие решения

Ваш getX Метод возвращается по значению, поэтому вы получаете копию X внутри B, Вам необходимо вернуть ссылку на X,

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

Кроме того, при печати указателя не следует использовать &, Вы хотите напечатать значение указателя, а не адрес указателя.

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

По вопросам рекламы [email protected]