2017-10-17 56 views
0

我試圖顯示從平面文件中讀取的未知數量的嵌套文件夾的目錄樹UI。我的想法是使用結構可能指向孩子和家長,像這樣:有點困惑的範圍,以及如何爲目錄樹創建嵌套的結構

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的添加嵌套結構,但讓他們訪問其他地方在節目中。

+0

調用用戶定義的函數'GetDirectoryContent(audioSelectTreeItem p_asti)'來顯示'self-repeataion loop'中的子文件夾和文件。您只需要選擇要保存目錄數據的文件夾和向量的廣告路徑。 –

+0

@ A.Godnov對不起,我寫如果我正在從一個實時目錄閱讀。我實際上是這麼做的,並且正在從「保存的目錄」保存的文件中讀取 – Shawn

+0

您正在閱讀的文件的格式是什麼? –

回答

1

什麼,你在這裏做的是創建一個指向它的作用範圍是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參考。這將導致循環依賴(父引用子引用父引用,因此它們都不能被刪除)

而個人觀點:類型名稱應該以大寫字母開頭。

+0

謝謝!我認爲這回答我的問題 – Shawn

+0

我會建議使用一個單一的列表(標準::矢量)與結構像'struct { \t FString folderName; \t FString folderPath; \t size_t parentIndex; };'。序列化和反序列化很簡單,管理起來也很簡單。 –