我有一个类,看起来像下面这样:
class ModelCommand {
public:
virtual ~ModelCommand() {};
};
class FolderCommand : public ModelCommand {
public:
std::string text;
unsigned width;
bool isBackspace;
FolderCommand(bool isBackspace, unsigned width, std::string text = "") : text(text), width(width), isBackspace(isBackspace) {}
};
class CModel {
private:
string _folder;
public:
void Update(std::shared_ptr<ModelCommand> &cmd);
};
然后在我的 Controller 中,有一个模型实例,并使用我创建的新FolderCommand对象对其进行更新:
shared_ptr<CModel> model;
shared_ptr<ModelCommand> cmd = dynamic_pointer_cast<ModelCommand>(make_shared<FolderCommand>(false, 20, "a"));
model->Update(cmd);
然后在CModel的更新方法中,尝试执行以下操作:
void CModel::Update(std::shared_ptr<ModelCommand> &cmd) {
if (auto folderCmd = dynamic_pointer_cast<FolderCommand>(cmd)) {
if(!folderCmd->isBackspace)
// This is where _folder is unable to read memory
_folder += folderCmd->text;
else if(folderCmd->isBackspace && _folder.length() > 0)
_folder.erase(--_folder.end());
folderCmd->text = _folder;
}
}
这导致CModel的_folder变量为“无法读取内存”。
有人可以解释并提供解决方案吗?
谢谢。
更新
添加了更多代码进行澄清
最佳答案
使用您发布的第一个代码片段,我按如下所示调用了Update方法,并且没有出现“无法读取内存”的问题。
int main()
{
shared_ptr<ModelCommand> fc(new FolderCommand("somestring\\"));
CModel mod;
mod.Update(fc);
mod.print_folder();
return 0;
}
我认为查看Update方法的使用方式会很有趣。
观察:我添加了一个公共(public)成员函数print_folder来打印_folder私有(private)成员。另外,我只发表评论,但是我仍然没有此特权。
关于c++ - C++字符串无法读取内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36607128/