У меня есть некоторые проблемы с моими указателями, и я не уверен, что я что-то напортачу.
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;
}
Проблема в том, что в классе B
метод X getX();
вернуть копию объекта X
, что означает, что каждый раз bObj.getX()
называется, новый X
объект предоставляется. Если что-то установлено в одном из этих перенастроенных объектов, это не имеет значения, потому что в следующий раз новый возвращается с исходным значением.
X getX()
метод должен возвращать ссылку X& getX()
Ваш getX
Метод возвращается по значению, поэтому вы получаете копию X
внутри B
, Вам необходимо вернуть ссылку на X
,
Class B: public A{
...
X xInfo;
X& getX();
// ^ Return reference
}
Кроме того, при печати указателя не следует использовать &
, Вы хотите напечатать значение указателя, а не адрес указателя.
cout << "Address one: " << bObj.getX().pointerToAType;
// ^ No & here