Need Help: Setting up My CPP. Save System

I’m creating a Save System, in CPP. which I’m trying to make it also interactable in Blueprints, and widget stuff.

I made Interface:

// Interface Declaration
UINTERFACE(MinimalAPI, Blueprintable)
class UF_CndGameSys_Save : public UInterface

// Interface Implemented Class
class PROJECT_API IF_CndGameSys_Save
{
	GENERATED_BODY()

public:

	// Add pure virtual functions to this class here. This is the class that will be inherited to implement this interface.

	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, meta = (DisplayName = "GameData Get"))
	void GD_Get(UCnd_GameData* GameData);

	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, meta = (DisplayName = "GameData Load"))
	void GD_Load(bool ASync);

	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, meta = (DisplayName = "GameData Save"))
	void GD_Save(bool ASync);


};

Heard GameInstance preserves data between levels/worlds. Well, I want it to load the game data, upon it initializes.

class PROJECT_API UCndGameInstance : public UGameInstance, public IF_CndGameSys_Save
{
	GENERATED_BODY()

public:

	// - INITIALIZER CONSTRUCTOR (Default)
	UCndGameInstance();


// Variables

public:


	UCndSys_SaveData* SaveData;
	FString SlotName;


// Functions
public:

	void BPF_Init();

};

I don’t know if I should include Interface in my Save System.


// Event Dispatcher
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FED_OnGameLoaded);

// Data Structure Class
class PROJECT_API UCnd_GameData : public USaveGame
{
	GENERATED_BODY()

public:

	UPROPERTY(VisibleAnywhere, Category = Basic)
	FCndSaveSys_GameData GD;

};


// Save Game Class
class PROJECT_API UCndSys_Save : public USaveGame, public IF_CndGameSys_Save

// Variables
public: 

	UPROPERTY(EditAnywhere, Category = Basic)
	uint32 GD_User_Index;

	UPROPERTY(EditAnywhere, Category = Basic)
	FString GD_SlotName;

	bool GD_ASyncSave;

//semi-public:

	UCnd_GameData* Cnd_SavedGD;

	UCndSys_Save* Cnd_SaveInstance;
	FAsyncSaveGameToSlotDelegate DEL_Cnd_ASyncSave_GD;
	FAsyncLoadGameFromSlotDelegate DEL_Cnd_ASyncLoad_GD;

private: 


// Event Dispatchers
public:

	UPROPERTY(BlueprintAssignable, Category = "Save System|Event Dispatchers")
	FED_OnGameLoaded OnGameLoaded;


// Functions
public: 

	// Player Data

	bool DoesSaveExists(FString SlotName, int32 User_Index);

	// Gets Player's Game Data
	UFUNCTION(BlueprintCallable, Category = "Saving System", meta = (DisplayName = "GameData Get", ToolTip = "Gets Player's Game Data."))
	void BPF_GD_Get(UCndSys_Save* GameData);

	// Saves Player's Game Data
	UFUNCTION(BlueprintCallable, Category = "Saving System", meta = (DisplayName = "Save Player Game Data", ToolTip = "Saves Player's Game Data."))
	void BPF_GD_Save(bool ASync);

	// Loads Player's Game Data
	UFUNCTION(BlueprintCallable, Category = "Saving System", meta = (DisplayName = "Load Player Game Data", ToolTip = "Loads Player's Game Data."))
	void BPF_GD_Load(bool ASync);


	void BPF_PTR_GD_Load();


	// New Save
	UFUNCTION(BlueprintCallable, Category = "Saving System", meta = (DisplayName = "Create New Save", ToolTip = "Creates new player Game Data."))
	void BPF_GD_CreateNew();


How I should set all of this properly?
Sitting on this for 4 days now.

Bump.