C++ 当指针初始化创建对象实例时,为什么std::string属性为空

C++ 当指针初始化创建对象实例时,为什么std::string属性为空,c++,object,pointers,stdstring,C++,Object,Pointers,Stdstring,我有一个家庭作业,我必须创建一个名为Player的抽象类(代码如下)和十几个派生的Player position类,并将每个类的一个实例存储在一个向量中。代码是从用户处获取播放器名称、播放器id和播放器位置,然后从适当的类实例化一个对象,如下所示: Quarterback player(name, id) 当我决定通过直接将对象分配给指针变量来创建对象实例时,遇到了一个问题: Player *player = &Quarterback("John Doe", 77); 执行此操作时的

我有一个家庭作业,我必须创建一个名为Player的抽象类(代码如下)和十几个派生的Player position类,并将每个类的一个实例存储在一个向量中。代码是从用户处获取播放器名称、播放器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)
{}

// ...
//Player.cpp
Player::Player(字符串名,int-id)
{
如果(名称==“”| |仅_空格(名称))
抛出“名称不能为空。”;
if(id<1)
抛出“ID号必须大于0。”;
playerName=名称;
playerID=id;
}
// ...
四分卫::四分卫(字符串名称,int-id)
:Player::Player(姓名、id)
{}
// ...
谢谢你的帮助

编辑:这里有一个更完整的版本,我的源代码是从我的家庭作业中提取出来的,放在这个链接的单个文件中。它不在GCC上编译(根据下面的注释,这是合适的行为),但它使用MSVC编译

您的指针悬空:

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

您正在存储立即死亡的临时用户的地址

“我这样做的问题是,新对象实例中的name属性为空,但id属性与我分配给它的内容保持不变。”我认为更大的问题是您应该得到的编译错误,因为您无法获取prvalue的地址。我不确定为什么我的问题被标记为duplicate。我问的问题和我所谓的“复制”问题并不完全相同。我知道什么是悬空指针,这是一个完全不同的问题。我只是没有意识到上面的代码创建了一个悬挂指针。“我只是没有意识到上面的代码创建了一个悬挂指针。”如果你的车有问题,有人将你链接到一篇关于如何更换机油滤清器的文章,那么有理由假设他们也说你的问题是机油滤清器,这应该改变。对于产生悬空指针的每一种可能的方法,当它们都达到“这是一个悬空指针”的程度时,对任何人都没有帮助,而且你的代码也不会编译。因此,问题应该被关闭直到生成编译代码。代码实际上在Visual C++ 2019中编译而不警告。此代码格式不正确,<代码>和<代码>不能应用于r值。