为什么通过指针初始化创建对象的实例时std :: string属性为空[duplicate]

问题描述 投票:1回答:1

此问题已经在这里有了答案:

我进行了一项家庭作业,其中我必须创建一个名为Player的抽象类(下面的代码)和十二个派生的Player位置类,并将每个实例的实例存储在单个向量中。代码是从用户那里获取玩家名称,玩家ID和玩家位置,然后从适当的类实例化一个对象,如下所示:

Quarterback player(name, id)

当我决定通过直接将其分配给指针变量来创建对象的实例时遇到问题:

Player *player = &Quarterback("John Doe", 77);

执行此操作时的问题是,新对象实例中的name属性为空,但id属性与我为其分配的内容保持不变。我的理论是,当我以这种方式创建对象时,字符串被认为是超出范围的,因为对象没有在主程序中直接引用。如果是这样,为什么对象的其余部分仍然正常存在?该声明的幕后发生了什么?

头文件:

// Player.h

class Player
{
public:
    Player(std::string name, int id);

    std::string getName() const;
    int getPlayerID() const;

    virtual std::string getPlayerPosition() const = 0;
    virtual std::string play() const = 0;
    virtual std::string toString() const = 0;

private:
    std::string playerName;
    unsigned int playerID;
};


class Quarterback : public Player
{
public:
    Quarterback(std::string name, int id);
    std::string getPlayerPosition() const override;
    std::string play() const override;
    std::string toString() const override;
};

// ...

源文件:

// Player.cpp

Player::Player(string name, int id)
{
    if (name == "" || only_whitespace(name))
        throw "Name cannot be empty.";
    if (id < 1)
        throw "ID number must be greater than 0.";
    playerName = name;
    playerID = id;
}

// ...

Quarterback::Quarterback(string name, int id)
    :Player::Player(name, id)
{}

// ...

谢谢您的帮助!

EDIT:这是从我的作业分配中提取的完整版本的源代码,并在此链接中放入一个文件中。它不能在GCC上编译(根据下面的评论,这是适当的行为),但是可以使用MSVC进行编译。

https://gcc.godbolt.org/z/r6vhDV

c++ object pointers stdstring
1个回答
2
投票

您的指针悬垂:

Player *player = &Quarterback("John Doe", 77);

您正在存储即将死亡的临时地址。

© www.soinside.com 2019 - 2024. All rights reserved.