c++ - 对范围以及如何为目录树创建嵌套结构有点困惑

标签 c++ struct scope directory-structure

我正在尝试显示从平面文件读取的未知数量的嵌套文件夹的目录树 UI。我的想法是使用一个可以像这样指向 child 和 parent 的结构:

struct audioSelectTreeItem {
    FString folderName;
    FString folderPath;
    struct audioSelectTreeItem* folderParentItem;
    TArray<struct audioSelectTreeItem*> childFolderItems;
};

当我读取已保存目录的文件时,我将所有子文件夹保存在 childFolderItems 中,并将父文件夹保存在 folderParentItem 中。在我的界面中,如果有人想进入文件夹,我会查看 folderParentItem,然后列出它的子文件夹和 childFolderItems。

我遇到的问题是如何保存它。我做了一个循环遍历文件夹和子项的函数,可以创建所有这些结构并保存它们。但是,我认为问题是,如果我在循环中创建一个结构,然后在之前的结构(子文件夹)中保存指向它的指针,我将无法从程序中的其他任何地方访问它。

有没有办法让这些更持久,完成后我该如何清理?

编辑:写得好像我在阅读实时目录。是一个包含目录信息的文本文件,我需要将其放入树界面。

更新: 下面是循环功能的一个小例子:

void AMyPlayerController::showAudioPicks() {
for (int counter = startCount; counter < fileStringArray.Num(); counter++) {  //startcount 3

        audioSelectTreeItem newTreeItem;
        newTreeItem.folderPath = fileStringArray[counter];
        mainListTree.childFolderItems.Add(&newTreeItem);

...

所以我的问题在于创建这些新的 audioSelectTreeItem 以添加嵌套在结构中,但让它们在程序的其他地方可访问。

最佳答案

您在这里所做的是创建一个指向堆栈变量的指针,该变量的作用域为 for 循环并在每个循环中销毁:

audioSelectTreeItem newTreeItem;
newTreeItem.folderPath = fileStringArray[counter];
mainListTree.childFolderItems.Add(&newTreeItem);

如果你想在堆而不是栈上创建一个对象(或结构),你必须使用new:

audioSelectTreeItem *newTreeItem = new audioSelectTreeItem;
newTreeItem->folderPath = fileStringArray[counter];
mainListTree.childFolderItems.Add(newTreeItem);

但是如果您这样做,您必须确保使用delete 释放该对象。通常这是在 audioSelectTreeItem 类(或结构)的析构函数中完成的:

class audioSelectTreeItem {
public:
    ~audioSelectTreeItem()
    {
        for (int i = 0; i < childFolderItems.Num(); i++)
            delete childFolderItems[i];
    }

    FString folderName;
    FString folderPath;
    class audioSelectTreeItem* folderParentItem;
    TArray<class audioSelectTreeItem*> childFolderItems;
};

父项是其子项的所有者,因此删除 folderParentItem 没有任何意义。一旦您删除了根,它的析构函数就会删除他的所有子项,依此类推。

在当前的 C++ 中,对于像这样的树有更安全的解决方案。例如,您可以使用托管指针而不是普通指针。由于引用计数,这会产生一些开销,但您永远不必自己释放堆:

#include <memory>

class audioSelectTreeItem
{
public:
    FString folderName;
    FString folderPath;
    std::weak_ptr<audioSelectTreeItem> folderParentItem;
    TArray<std::shared_ptr<audioSelectTreeItem>> childFolderItems;
};

不要将 shared_ptr 用于 folderParentItem 引用。这样会导致循环依赖(父引用子,子引用父,所以都不能删除)

个人意见:类型名称应该以大写字母开头。

关于c++ - 对范围以及如何为目录树创建嵌套结构有点困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46781865/

相关文章:

c++ - 在 C++ 中初始化 boolean vector 的标准方法是什么

c - 如何将文件中的结构读入数组,修改它并将其写回?

c++ - 在函数中调用结构的构造函数,C++

JavaScript 范围 : passing a variable from an outer function to an inner function

java - 类范围变量与方法范围变量

c++ - 移动数组 C++ 中的元素

c++ - C++异常的正确使用

C++ 为什么在定义重载和引用函数时每个函数都应该有一个引用限定符

struct - 如何捕获结构中的自消耗变量?

php - Phalcon 从不同模块中的 Controller 查询模型