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

Why std::string attribute is empty when instance of object is created by pointer initialization

我有一个家庭作业,我必须创建一个抽象的 class 命名为 Player(下面的代码)和十几个派生的玩家位置 classes 并将每个实例存储在一个向量中.代码是从用户获取玩家名称、玩家id和玩家位置,然后从适当的class实例化一个对象,像这样:

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)
{}

// ...

感谢您的帮助!

编辑: 这是从我的家庭作业中提取的源代码的更完整版本,并放在这个 link 的单个文件中。它不在 GCC 上编译(根据下面的评论,这是适当的行为),但它用 MSVC 编译。

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

您的指针悬空:

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

您正在存储一个立即死亡的临时地址。