【问题标题】:Pointer changes value after storing it in an object (C++)指针在将其存储在对象中后更改值(C++)
【发布时间】:2020-09-12 15:34:08
【问题描述】:

我注意到(对我而言)奇怪的行为。如果我初始化一个 DerivedClass 并将另一个类的指针 (player) 传递给它,那么它会接收到正确的指针值。但是,如果我随后尝试使用该指针,稍后在check_pointer_of_player() 中,值会发生变化。我不明白这种行为,我想知道如何实现目标:在DerivedClass 中使用player 的功能。

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

我如何仍然实现我的目标。

【问题讨论】:

    标签: c++ class object pointers reference


    【解决方案1】:

    在构造函数体内,参数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";
    }
    

    【讨论】:

    • 或者把player(player)放在ParentClass(p)旁边
    • @QuentinUK 当然,这是一个更好的解决方案。添加它,谢谢:)
    • 哦,哇,现在我真的很愚蠢,没有发现这一点,哈哈!好吧,我能说什么,非常感谢。它现在就像一个魅力,你的答案真的很清楚!
    • 好,我很高兴这很有意义。乐于助人:)
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2016-07-05
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多