所以我试图在c ++中实现文件系统。 我有一个包含地图的目录类。 每个目录都可以在其中保存另一个目录(所以我在地图中有一个地图)
我试图删除一个文件/目录,在它删除的方法中一切都很好,但方法已经完成,我的主地图没有更新......
这里有相关代码:
目录类(使用Composite实现):
class Directory : public FileComponent
{
private:
std::map<std::string,FileComponent*> directoryList;
public:
std::map<std::string, FileComponent*> &getMap() {
return directoryList;
}
class fileSystem:
private:
FileComponent* find(Mode mode, const std::string& newDirectory, const std::string& directoryName, std::map<std::string, FileComponent*> check);
std::map<std::string,FileComponent*> fileSystem;
};
这是我尝试做的事情(查找文件并将其复制......)
void filesys::copy(const std::string& fileName, const std::string& directoryName){
//looking for file
mapitr itr = fileSystem.find(fileName);
if (itr != fileSystem.end()){
fileSystem.erase(itr);
//file found, looikng for directory
}
else{
for (itr = fileSystem.begin(); itr != fileSystem.end(); itr++){
FileComponent* toCopy = find(CopyFile, fileName, directoryName, itr->second->getMap());
if (toCopy != nullptr)
//found! need to copy
break;
}
}
}
和我的发现方法:
FileComponent* filesys::find(Mode mode,const std::string& newDirectory, const std::string& directoryName, std::map<std::string,FileComponent*> check){
else if (mode == CopyFile){
mapitr itr = check.find(newDirectory);
if (itr != check.end()){
FileComponent* toCopy = itr->second;
check.erase(itr);
return toCopy;
}
else{
for (itr = check.begin(); itr != check.end(); itr++){
FileComponent* toCopy;
try{
toCopy = find(CopyFile, newDirectory, directoryName, itr->second->getMap());
if (toCopy != nullptr){
return toCopy;
}
}
catch (mExceptions& e){
e.what();
}
}
return nullptr;
}
}
}
它找到并删除的函数内部,所有内容似乎都是有序的...但是一旦返回目录/文件仍然在我的文件系统中... 我通过引用返回我的内部地图......所以我真的没有想法为什么它不想工作...
提前感谢!
答案 0 :(得分:0)
您将 value 的参数check
(地图)传递给find
函数。这意味着数据被复制,您只能处理副本而不是原始数据。您应该通过*引用传递它:
std::map<std::string,FileComponent*>& check
在一个不相关的注释中,函数名find
不是一个好名字,它并没有真正描述真正所做的功能,即找到和擦除。
答案 1 :(得分:0)
在
filesys::find(Mode mode,
const std::string& newDirectory,
const std::string& directoryName,
std::map<std::string, FileComponent*> check)
您按值传递check
,而不是按引用传递,因此您修改副本,而不是原始副本。