计算器!
对于我最近的任务,我遇到了一个我无法解决的问题
它背后的想法非常简单,你有一个名为Dir_or_File
的基本类,它代表(顾名思义)一个目录或一个文件。其中每个变量本身都有两个变量,它有一个name
对应于它的路径和entries
,它由一个向量组成,它跟踪包含在其中的所有目录或文件。我的目录。
为了解决这个问题,我创建了一个名为split_after_slash
的方法,它将任何字符串转换为字符串向量,在每个斜杠之后拆分," o1 / o2 / o3 /&#34 ;成为带有条目的矢量" o1 /"," o2"和" o3"。此方法已经过测试,可以按预期工作。只是为了澄清,我将在稍后使用它。
考虑到这一点,构造函数导致了问题,我的想法是,我给构造函数一个路径(作为字符串),它将启动一个目录。
例如:
Dir_or_File dir("/home/music/song.mp3");
应创建Dir_or_File
对象" dir",其中包含name
,即" /home/music/song.mp3"以及一个名为entries
的向量,它本身包含Dir_or_File
name
" home / music / song.mp3"和entries
Dir_or_File
,名称为" music / song.mp3"在它等等。最后,您将获得最后一个名为" song.mp3"的条目,其中包含entries
的空列表。
我的想法是通过递归解决所述问题,我尝试了以下方式:
Dir_or_File::Dir_or_File(std::string name)
{
this->name = name;
std::vector<std::string> full_path = split_after_slash(name);
if (full_path.size() > 1)
{
std::string new_param;
for (unsigned int i = 1; i < full_path.size(); i++)
{
new_param.append(full_path[i]);
}
Dir_or_File new_entry(new_param);
entries.push_back(&new_entry);
}
}
设置name
是自我解释的,分割字符串也应该是。在那之后,我只需要知道路径中是否还有多个字符串,这意味着我将在一个文件夹中,它仍然有一个子文件夹,如果有一个子文件夹,我会调用构造函数除了我目前所处的文件夹之外的所有内容,如果没有子文件夹,我也不需要添加任何条目,entries
。
但是如果我现在测试我的代码,我可以创建一个Dir_or_File
,在entries
中有一个条目,但就是这样,该条目没有名称,但有些乱码和空entries
矢量,我在这里做错了什么?
答案 0 :(得分:3)
这是我的方法或可以修复的东西根本出错吗?
是。是。
行
go
是您问题的根源。 Dir_or_File new_entry(new_param);
entries.push_back(&new_entry);
是函数中的局部变量。将其地址存储在new_entry
中并不好。当函数返回时,entries
将包含一个悬空指针列表。
您可以使用几种方法解决问题。
使entries
成为对象的向量而不是指针向量。然后,您可以使用
entries
使用 entries.push_back(new_entry);
分配动态内存,并将指针存储在new
中。
entries
请注意,如果您使用第二种方法,则必须编写一堆预订代码来管理指针。使用第一种方法会更容易,这也会减少错误的代码。
您可以在Dir_or_File* new_entry = new Dir_of_File(new_param);
entries.push_back(new_entry);
中存储智能指针而不是原始指针,但即使这样也需要您了解如何智能指针。第一种方法仍然更好,IMO。