2017-10-17 13 views
0

フラットファイルから読み込まれる未知の量のネストされたフォルダのUIを表示しようとしています。私はchildFolderItemsで任意のサブフォルダとfolderParentItemで親を保存保存したディレクトリのファイルを読み込むときちょっと混乱して、ディレクトリツリーのネストされた構造体を作成する方法

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

:私の考えはそうのような子どもたちや保護者を指す可能性構造体を使用することでした。そうすれば、私のインターフェースでは、誰かがフォルダーに行きたいと思ったら、私は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)'を呼び出して、サブフォルダーとファイルを '自己反復ループ 'に表示します。 dirデータを保存する選択されたフォルダとベクトルのAdspathのみが必要です。 –

+0

@A.Godnov申し訳ありませんが、ライブディレクトリから読んでいるかのように書いています。私は実際にそれを以前にして、 "保存されたディレクトリ"の保存されたファイルから読んでいます – Shawn

+0

あなたは読んでいるファイルの形式は何ですか? –

答えて

1

あなたはすべてのループにループのためにスコープされ、破壊されたスタック変数へのポインタを作成して、ここでやっている:あなたは上のオブジェクト(または構造)を作成したい場合は

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

folderParentItemの参照用のshared_ptrを使用しないでください。これは周期的な依存関係につながります(親と子の親参照は親を参照するので削除できません)

個人的意見:型名は大文字で始まります。

+0

ありがとう!私は自分の質問に答えていると思う。 – Shawn

+0

'struct { \t FString folderName;のような構造を持つ単一のリスト(std :: vector)を使うことをお勧めします。 \t FString folderPath; \t size_t parentIndex; }; '。シリアライズ、デシリアライズ、管理が簡単です。 –

関連する問題