Указатель меняет значение после сохранения в объекте (C ++) - PullRequest
0 голосов
/ 26 мая 2020

Я замечаю (для меня) странное поведение. Если я инициализирую DerivedClass и передаю ему указатель другого класса (player), он получает правильное значение указателя. Однако, если я попытаюсь использовать этот указатель позже, в check_pointer_of_player(), значение изменится. Я не понимаю этого поведения и хотел бы знать, как я могу альтернативно достичь цели: использовать функции player внутри DerivedClass.

class DerivedClass : public ParentClass {
    protected:
        Player* player;
    public:
        DerivedClass(Coord p, Player* player) : ParentClass(p) {
            std::cout << "During intialization the pointer value is: " << player << "\n";
            player = player;
        }

        void check_pointer_of_player() {
            std::cout << "Now the pointer value is: " << player << "\n";
        }

Как я уже писал, во время инициализации указатель значение правильное, но позже, когда я вызываю функцию этого класса check_pointer_value(), она возвращает другое значение. Ниже показан результат.

Во время инициализации значение указателя: 0x7f908f558710

Теперь значение указателя: 0x7fff41140004

Как мне еще добиться моя цель.

1 Ответ

3 голосов
/ 26 мая 2020

Внутри тела конструктора параметр player затеняет член player, поэтому вы фактически не назначаете параметр члену. Вот почему только конструктор показывает правильное значение player при его распечатке.

Вы можете устранить неоднозначность следующим образом:

DerivedClass(Coord p, Player* player) : ParentClass(p) {
    std::cout << "During intialization the pointer value is: " << player << "\n";
    this->player = player;
}

Или просто укажите у параметра другое имя:

DerivedClass(Coord p, Player* player_param) : ParentClass(p) {
    std::cout << "During intialization the pointer value is: " << player << "\n";
    player = player_param;
}

Лучшим вариантом было бы использовать список инициализаторов членов, где имена могут быть фактически одинаковыми, поэтому вы можете сделать:

DerivedClass(Coord p, Player* player) : ParentClass(p), player(player) {
    std::cout << "During intialization the pointer value is: " << player << "\n";
}
...