c++ - 为什么通过指针初始化创建对象实例时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 编译。
解决方案
你的指针悬空:
Player *player = &Quarterback("John Doe", 77);
您正在存储立即死亡的临时地址。
推荐阅读
- python - 将第三方日志重定向到日志文件 - Python
- php - 正则表达式匹配字符串以美元符号开头并包含 ( 并且没有空格或连字符
- nginx - 使用 vm 重写 Nginx 配置的规则
- asp.net-core - 无法使用 Serilog 和 .Net Core 5 捕获实例化错误
- google-apps-script - 使用 GmailApp 从 Google App 脚本创建 HTML 草稿
- javascript - How to filter multiple extension files using node js
- javascript - 基于条件开关案例的同一组件中的多个不同嵌套路由 - vue
- java - 无法让 String.valueOf(int) 方法工作
- c++ - 哪种数据结构可以轻松添加和删除项目并易于完全销毁?
- azure - Azure 监控日志 VS Azure 数据资源管理器