对范围以及如何为目录树创建嵌套结构有点困惑
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可以删除)
个人意见:类型名称应以大写字母开头。
我正在尝试显示从平面文件读取的未知数量的嵌套文件夹的目录树 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可以删除)
个人意见:类型名称应以大写字母开头。