【问题标题】:Object containing lists of itself recursively递归地包含自身列表的对象
【发布时间】:2015-02-14 20:44:46
【问题描述】:

为了练习,我正在尝试制作一个递归目录解析器。

为了简洁起见,我也想递归地包含结果,例如:

1 class CDirectory
2 {
3     private:
4        std::string name;
5        std::vector<CDirectory> subDirectories
6    public:
7        //Various things, constructors etc. go here
8 }

但是,I see here 不支持第 5 行的行为 - “C++ 标准 (2003) 明确指出,实例化具有不完整类型的标准容器会调用未定义行为。”

那么,我该怎么办?有没有办法让一个对象包含类似对象的列表?如果不出意外,我知道制作向量的向量绝不是非法的,所以这是一个包含自身的对象。

【问题讨论】:

  • 你们都在考虑是否投票结束:做吧。我同意另一个问题(在顶部编辑)与这个问题相同。
  • 你不能创建同种向量的向量。

标签: c++ object


【解决方案1】:

创建一个指针向量

std::vector<CDirectory*> subDirectories;

【讨论】:

  • 我会考虑使用 std::shared_ptr&lt;CDirectory&gt; 而不是原始指针来缓解内存管理/生命周期问题。
  • 我没有太多使用这些的经验。我将编辑我的答案...让我知道它是否正确。
  • @sdzivanovich 这是假设需要共享语义。这一点都不清楚。
  • 没错,我改回来了。
  • std::unique_ptr 几乎总是比原始指针好。
【解决方案2】:

Boost 有containers that support incomplete types。您可以使用其中之一。

#include <boost/container/vector.hpp>

class CDirectory
{
   private:
       std::string name;
       boost::container::vector<CDirectory> subDirectories
   public:
       //Various things, constructors etc. go here
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 2016-02-19
    • 2019-09-23
    • 2015-10-02
    • 1970-01-01
    • 2013-05-16
    • 2022-10-07
    • 2015-11-08
    相关资源
    最近更新 更多