首页 > 解决方案 > 为什么通过指针初始化创建对象实例时std :: string属性为空

问题描述

我有一个家庭作业,我必须创建一个名为 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)
{}

// ...

谢谢您的帮助!

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

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

标签: c++objectpointersstdstring

解决方案


你的指针悬空:

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

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


推荐阅读