0
votes

C ++ Instance statique d'Enum partagée entre deux fichiers source

Je fais une partie. J'ai deux fichiers source, game.cpp et renduhandler.cpp. J'ai un fichier d'en-tête, gamestate.h. Le fichier gamestate.h contient une instance statique d'une énumération qui représente les différents états de jeu.

Je souhaite partager cette variable statique avec les deux fichiers source. Je ne veux pas deux variables distinctes dans chaque fichier source. Si je modifie la valeur de la variable d'état du jeu, je souhaite que cela soit transféré dans l'autre fichier source. P>

gamestate.h p> xxx pré>

jeu.cpp

#include "../inc/gameState.h"
void RenderHandler::render()
{
    if (gameState == State::start) {
        // code
    }
    else if (gameState == State::play) {
        // code
    }
    else if (gameState == State::stop) {
        // code
    }
}
La valeur de gamestate est modifiée dans le fichier game.cpp. Mais cela n'affecte pas la valeur du gamestate dans Renderhandlerler.cpp, il est par défaut à 0, ce que je ne veux pas. Le changement de valeur se produit avant l'exécution du code de rendu. P>

Comment puis-je partager une instance statique d'une énumération entre deux fichiers source? Est-ce que mon logique ne va pas et dois-je pas utiliser des en-têtes et des énumérations de cette façon? P> P>


1 commentaires

Pourquoi faites-vous cela statique ? N'est-ce pas le but de statique de le rendre local à un seul fichier?


3 Réponses :


2
votes

Ne partagez pas les valeurs globales directement comme celle-ci. Vous pouvez courir dans FIASCO d'initialisation statique, qui est vraiment difficile à Détecter.

Utilisez une fonction à la place: p>

#include "../inc/gameState.h"
void RenderHandler::render()
{
    if (gameState() == State::start) {
        // code
    }
    else if (gameState() == State::play) {
        // code
    }
    else if (gameState() == State::stop) {
        // code
    }
}


1 commentaires

OMG Est-ce que cela fonctionne vraiment? Je vais essayer cela mais je pense que c'est incroyable, merci



0
votes

Votre logique est fausse, si vous déclarez une variable statique dans un fichier d'en-tête et l'inclure à partir de deux fichiers C ++ différents, alors ce que vous obtenez est deux instances d'une variable statique avec le même nom mais n'utilisant pas la même adresse mémoire. .

Pour utiliser une instance, vous devez soit utiliser une variable globale (mauvais, car il rend le code difficile à entretenir), utilisez un singleton (mieux, mais doit toujours être évité car il est également difficile de maintenir ), ou simplement créer une instance de cette variable d'état au début de votre programme, puis en lui donnez une référence dans les classes en l'utilisant dans leurs constructeurs.


0 commentaires

0
votes

"statique" n'a aucune signification sur les variables globales. Vous devez marquer la variable globale comme "externe" et ajouter son initialisation à gamestate.cpp

en-tête: Etat externe GameState;

CPP: État gamestate = * Valeur initiale initiale ;

et ajouter ce CPP à la compilation de votre projet.

Remarque: il fonctionnera comme prévu uniquement dans le même module, si vous ajoutez gamestate.cpp à un autre module, il créera une nouvelle variable globale locale pour le module.


0 commentaires