Comment déclarer une instance statique d'une Classe en C++?
Il y a quelques mois j'ai créé un Projet C# d'un jeu appelé Vexé. Maintenant, je suis en création d'un Tetris, mais en C++. Fondamentalement, je veux utiliser la même logique que j'ai utilisé dans l'autre projet, c'était un peu comme ceci:
J'ai créé une Catégorie appelée "Jeu" où il y a toutes les informations sur le jeu. Il y avait des méthodes, variables et tout et tout. Ensuite, j'ai créé une classe statique appelée "PublicInstances" ou quelque chose comme ça, et dans la classe que j'ai déclaré quelque chose comme ceci:
static class PublicInstances
{
public static Game vexedGame = new Game(); //This is C# and works.
}
Il fait tellement simple à utiliser, puis, parce que tout changement que j'ai fait sur le jeu a été enregistré lors de la statique instance de ma classe et j'ai pu y accéder de n'importe où sur le projet. Je veux savoir comment faire exactement cela avec C++, de créer un public, ou de l'instance globale de ma classe le Jeu donc je peux y accéder et de le changer partout et ont tout mis à jour, sous quelque Forme ou la classe de mon projet. Je serais vraiment reconnaissant de votre aide.
//Désolé si mon anglais n'est pas le meilleur ^^
Mon principal problème est que j'ai l'habitude de voyager entre les Formes, et j'ai besoin d'obtenir de l'information d'un endroit à un autre, comment pourrais-je changer l'utilisation d'une variable globale ou de la classe?
Il semble que si
TetrisGame
devrait être un espace de noms, pas un objet. Qui permettra également d'éliminer la nécessité de définir un type de classe.Je suis d'accord avec le fait que cette conception est sans doute un peu imparfait, mais, c'est au-delà de la question. De toute façon, je serais encore vous proposons de vous revoir.
OriginalL'auteur avatarbobo | 2013-10-02
Vous devez vous connecter pour publier un commentaire.
Revisité et résumées
Option 1
Vous pouvez simplement déclarer et définir une instance globale de Jeu de l'objet.
Dans un fichier d'en-tête, par exemple, de jeu.h:
Lorsque vous incluez le jeu.h dans un fichier source globalGameObj nom devient visible.
Vous avez également besoin de créer un objet réel. Dans un fichier source, par exemple game.cc (en dehors de toute classe):
Y accéder par le nom de la variable:
Option 2
Utiliser un modèle souvent appelé singleton. Ajoutez les lignes suivantes à votre classe de Jeu (jeu.h):
Vous accédez Jeu avec shared_instance() méthode:
Vous de ne pas utiliser quelque chose comme votre
static class PublicInstances
ci-dessus. C++ permet d'introduire un espace de noms (par exemple, PublicInstances) afin de fournir le nom de l'isolement et de garder vos objets à un endroit, mais il va probablement être un overkill. Dans tous les cas, si vous avez quelques objets globaux alors il est susceptible d'être une mauvaise conception.Quelle est la meilleure option? Certaines personnes diront que le pattern singleton doit être utilisé. Il garantit qu'une seule instance est créée. Toutefois, l'option 1 et l'option 2 ont le même problème: elles introduisent un objet global dans votre code avec tous les inconvénients attribués à des variables globales. Je dirais que le singleton est un objet global dans le déguisement. Je ne vois pas de décider de la technique raisons en faveur de l'une ou l'autre option, alors je dirais que c'est une question de goût personnel.
Note historique 🙂
Ma première suggestion pour l'Option 2 a été d'utiliser un allouée dynamiquement Jeu de l'objet plutôt qu'une fonction statique locale de l'objet.
Peu de gens ont suggéré qu'il n'était pas le meilleur moyen de plus, merci Kal, argiopeweb et Simple. C++03 a des problèmes d'initialisation des objets statiques en présence de threads. C++11 garantit la sécurité de l'initialisation de la statique.
C++11 projet de, section 6.7
Vous avez déclaré
S::_inst
mais vous n'avez pas défini.aussi une meilleure façon de le faire est
static S& instance() { static S inst; return inst; }
N'est-il pas clair ce que tu veux dire, pas de classe est nécessaire. Classe de jeu est là par défaut.
en fait u peut; la ctor est appelée lorsque la fonction est appelée pour la première fois. aussi u peut passer des paramètres à la ctor, tout comme
static S inst { 1, 2 };
ou que ce soitOriginalL'auteur dmitri