How to write c++ structs? (Get Compiler Errors)

Hi

I implemented some Game Mechanics with Blueprints and am now tying to convert my logic to C++…
But I can’t get my structs through the compiler…

For example I created a FCityData Struct in VS which I want to use for the SaveGame process.
VS is telling me there is a missing semicolon and the if I press compile in Unnreal Editor a weird error message like shows up in the message log.

CityData Header:

// CityData.h
//
USTRUCT()
struct FCityData
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY()
	FString cityName;
	UPROPERTY()
	int32 coins;
	UPROPERTY()
	int32 wood;
	UPROPERTY()
	int32 stone;
	UPROPERTY()
	int32 food;

	//Constructor
	FCityData()
	{
		cityName = "";
		wood = 0;
		stone = 0;
		food = 0;
	}

};

SaveGame Header:

// MySaveGame.h
//
#pragma once

#include "GameFramework/SaveGame.h"
#include "CityData.h"
#include "PmcSaveGame.generated.h"

UCLASS()
class PMC_API UMySaveGame : public USaveGame
{
	GENERATED_BODY()
	
public:
	UPROPERTY()
	FString playerName;
	UPROPERTY()
	FCityData cityData;
	
};

Error Messages:

Translated it would be mean someting like

  • “FString”: Unkown declaration
  • “cityName”: Unkown declaration
  • Missing Type Specifier int is
    accepted. NOTE: “default-int” is not
    supportet by C++.

CompilerResultsLog:Error: Error c:\users\tom coursow\documents\unreal projects\dgtill\pmc 4.10\source\pmc\CityData.h(11) : error C3646: “FString”: Unbekannter ?berschreibungsspezifizierer
CompilerResultsLog:Error: Error c:\users\tom coursow\documents\unreal projects\dgtill\pmc 4.10\source\pmc\CityData.h(11) : error C3646: “cityName”: Unbekannter ?berschreibungsspezifizierer
CompilerResultsLog:Error: Error c:\users\tom coursow\documents\unreal projects\dgtill\pmc 4.10\source\pmc\CityData.h(11) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: “default-int” wird von C++ nicht unterst?tzt.
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Source\pmc\CityData.h(24) : error C2065: “cityName”: nichtdeklarierter Bezeichner
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Intermediate\Build\Win64\UE4Editor\Inc\pmc\pmc.generated.cpp(22) : error C2039: “StaticStruct”: Ist kein Element von “FCityData”
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Source\pmc\CityData.h(7) : note: Siehe Deklaration von “FCityData”
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Intermediate\Build\Win64\UE4Editor\Inc\pmc\pmc.generated.cpp(34) : error C2039: “StaticStruct”: Ist kein Element von “FCityData”
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Source\pmc\CityData.h(7) : note: Siehe Deklaration von “FCityData”
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Intermediate\Build\Win64\UE4Editor\Inc\pmc\pmc.generated.cpp(185) : error C2039: “cityName”: Ist kein Element von “FCityData”
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Source\pmc\CityData.h(7) : note: Siehe Deklaration von “FCityData”
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Intermediate\Build\Win64\UE4Editor\Inc\pmc\pmc.generated.cpp(185) : error C2664: “UStrProperty::UStrProperty(const UStrProperty &)” : Konvertierung von Argument 1 von “FObjectInitializer” in “ECppProperty” nicht m?glich
CompilerResultsLog:Error: Error C:\Users\Tom Coursow\Documents\Unreal Projects\Dgtill\pmc 4.10\Intermediate\Build\Win64\UE4Editor\Inc\pmc\pmc.generated.cpp(185) : note: Kein benutzerdefinierter Konvertierungsoperator verf?gbar, der diese Konvertierung durchf?hren kann, oder der Operator kann nicht aufgerufen werden

I think what you are missing is simple one keyword.

struct PROJECTNAME_API FCityData

at least everything else looks nearly the same with my struct, which does compile:

USTRUCT()
struct COOPBASIC_API FWeaponData
{
	GENERATED_BODY()

	/** inifite ammo for reloads */
	UPROPERTY(EditDefaultsOnly, Category = Ammo)
		bool bInfiniteAmmo;

	/** infinite ammo in clip, no reload required */
	UPROPERTY(EditDefaultsOnly, Category = Ammo)
		bool bInfiniteClip;

	/** max ammo */
	UPROPERTY(EditDefaultsOnly, Category = Ammo)
		int32 MaxAmmo;

	/** clip size */
	UPROPERTY(EditDefaultsOnly, Category = Ammo)
		int32 AmmoPerClip;

	/** initial clips */
	UPROPERTY(EditDefaultsOnly, Category = Ammo)
		int32 InitialClips;

	/** bullet / line trace bounces off wall */
	UPROPERTY(EditDefaultsOnly, Category = WeaponStat)
		bool bIsBouncing;

	/** time between two consecutive shots */
	UPROPERTY(EditDefaultsOnly, Category = WeaponStat)
		float BounceRange;

	/** if false the player needs to click for each shot */
	UPROPERTY(EditDefaultsOnly, Category = WeaponStat)
		bool bIsAutomatic;

	/** time between two consecutive shots */
	UPROPERTY(EditDefaultsOnly, Category = WeaponStat)
		float TimeBetweenShots;

	/** failsafe reload duration if weapon doesn't have any animation for it */
	UPROPERTY(EditDefaultsOnly, Category = WeaponStat)
		float NoAnimReloadDuration;

	// defaults
	FWeaponData()
	{
		bInfiniteAmmo = false;
		bInfiniteClip = false;
		bIsAutomatic = true;
		bIsBouncing = false;
		MaxAmmo = 10;
		AmmoPerClip = 10;
		InitialClips = 4;
		TimeBetweenShots = 0.2f;
		BounceRange = 500;
		NoAnimReloadDuration = 1.0f;
	}

};

Basically I have written the struct not in an extra file but in the header of the class where i need to use it. So it’s under the #includes and above the UCLASS() statement. By the way try to use “GENERATED_BODY()” instead of
GENERATED_USTRUCT_BODY(), this is atleast what I’ve read so far.
Hope this helps!

Thank you very much.
After placing the struct in my ACity Actor Class it works fine…
Sometimes the UE4 C++ magic is realy annoying for me personly… ^^

Thank you Theololz for helping me out :slight_smile: