在构造函数中更新指针向量的问题

时间:2017-07-23 18:01:44

标签: c++ pointers vector constructor

计算器! 对于我最近的任务,我遇到了一个我无法解决的问题 它背后的想法非常简单,你有一个名为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矢量,我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

  

这是我的方法或可以修复的东西根本出错吗?

是。是。

go

是您问题的根源。 Dir_or_File new_entry(new_param); entries.push_back(&new_entry); 是函数中的局部变量。将其地址存储在new_entry中并不好。当函数返回时,entries将包含一个悬空指针列表。

您可以使用几种方法解决问题。

  1. 使entries成为对象的向量而不是指针向量。然后,您可以使用

    entries
  2. 使用 entries.push_back(new_entry); 分配动态内存,并将指针存储在new中。

    entries
  3. 请注意,如果您使用第二种方法,则必须编写一堆预订代码来管理指针。使用第一种方法会更容易,这也会减少错误的代码。

    您可以在Dir_or_File* new_entry = new Dir_of_File(new_param); entries.push_back(new_entry); 中存储智能指针而不是原始指针,但即使这样也需要您了解如何智能指针。第一种方法仍然更好,IMO。