Also habe ich versucht, einen Shared-Zeiger auf eine Struktur zu verwenden, um alle Daten in meinem Programm zu halten, die zwischen Zuständen in meinem Zustandsautomaten geteilt werden können.Globales Objekt interagierte mit freigegebenen Zeigern
struct GameData
{
StateMachine machine;
sf::RenderWindow window;
AssetManager assets;
InputManger input;
const int x = 1;
};
typedef std::shared_ptr<GameData> GameDataRef;
Dies ist eine Datei, die nur eine Schnittstelle zwischen freigegebenen Datenressourcen bereitstellt. GameData.cpp
GameDataRef _data = std::make_shared<GameData>();
In meiner game.cpp Datei mit dem Namen, wenn ich das richtig verstehen, make_shared
das Objekt erstellt und weist den shared_ptr
namens _data zu.
StateRef _splash = std::make_unique<State_Splash>(_data);
Dies ist die Zeile, die einen Basiszustand erstellt, um das Spiel mit zu starten. Abgesehen von der Tatsache, dass der Shared-Pointer als Argument verwendet wird.
GameDataRef _data;
ich einen anderen gemeinsamen Zeiger im State_Splash.cpp machen _DATA
genanntState_Splash::State_Splash(GameDataRef GDR) : _data(GDR)
im Konstruktor I (vergessen, den Begriff für das, was nach dem kommt: hier)
std::cout << _data->x;
Dies gibt 0 an die Konsole aus, obwohl x in der Struktur als 1 definiert ist. Ich habe diesen Test ausgeführt, weil eine Textur, die ich in _data-> Assets in der Game.cpp geladen habe, außerhalb des Gültigkeitsbereichs (leerer weißer Bildschirm) war zu referenc e es zu einem Sprite in der State_Splash.cpp.
Meine Frage ist, mache ich etwas falsch mit geteilten Zeigern? Oder gibt es eine bessere Möglichkeit, ein gemeinsames Ressourcen-Depot für das gesamte Programm zu erstellen?
Versuchen Sie 'cout << _data.get()'. Was zeigt es? –
es gibt zurück 00221E40 –
Die Linien, die Sie zur Verfügung gestellt haben, sehen gut aus. Es muss etwas geben, das du nicht merkst oder nicht für wichtig hältst. Versuchen Sie, das Beispiel auf ein Minimum zu reduzieren und zu überprüfen, ob es sich reproduziert.Idealerweise sollte sich der gesamte Code in einer cpp-Datei befinden. Dann können Sie ihn hier einfach einfügen. – Sergei