gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:13:09 25 4
gpt4 key购买 nike

<分区>

我有一个家庭作业,我必须创建一个名为 Player 的抽象类(下面的代码)和十几个派生的玩家位置类,并将每个类的实例存储在一个 vector 中。代码是从用户那里获取玩家名称、玩家 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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com