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

A little confused on scope and how to create nested structs for directory tree

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

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

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

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

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

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

更新: 下面是循环作用的一个小例子:

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(或结构)的析构函数中完成的:

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;
};

不要对 folderParentItem 引用使用 shared_ptr。这会导致循环依赖(父引用子,子引用父,所以none可以删除)

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