C++ Déclaration de variables de classe dans l'en-tête ou le .rpc?
Jusqu'à présent, j'ai été en utilisant les classes de la manière suivante:
GameEngine.h déclare la classe comme suit
class GameEngine {
public:
//Declaration of constructor and public methods
private:
InputManager inputManager;
int a, b, c;
//Declaration of private methods
};
Mon GameEngine.cpp fichiers puis il suffit de mettre en œuvre les méthodes
#include "____.h"
GameEngine::GameEngine() {
}
void GameEngine::run() {
//stuff
}
Cependant, j'ai lu récemment que les déclarations de variables ne sont pas censés être dans le fichier d'en-tête. Dans l'exemple ci-dessus, ce serait un inputManager et a, b, c.
Maintenant, j'ai été la recherche de l'endroit où placer les déclarations de variables, le plus proche de la réponse que j'ai trouvé est celle-ci: Déclaration de Variable dans un fichier d'en-tête
Cependant, je ne sais pas si l'utilisation de extern a du sens ici; je viens de déclarer les variables privées qui ne sera utilisé que dans une instance de la classe elle-même. Sont mes déclarations de variables dans les fichiers d'en-tête fine? Ou dois-je les mettre ailleurs? Si je dois les mettre dans le fichier cpp, ils vont directement en vertu de la #include?
Si la variable est destinée à être utilisée à l'échelle mondiale, alors extern va dans l'en-tête, et vous définissez la variable une fois dans certains .fichier cpp. Si ils sont des variables globales utilisées en interne, puis ils vont dans le .rpc. Si ils sont logiquement partie de la classe, puis de les rendre variables membres.
Les déclarations de variables et de membre les déclarations de variables sont différentes. Et d'ailleurs, c'est le définition de la non-membre variables qui vont vous donner des problèmes, pas les déclarations.
Avez-vous l'intention d'utiliser le Pimpl idiome? Je ne comprends pas ce que vous avez lu.
Essayé, mais impossible de trouver l'original de la déclaration plus. Il était quelque part, en fait, mais depuis que j'ai essayé de chercher une réponse, mon histoire est trop plein pour le localiser à nouveau. Pour moi ça sonnait comme une déclaration générale de déclarer des variables dans .h dossiers de mauvais style de programmation; Toutefois, compte tenu de vos réactions, j'ai probablement mal compris.
OriginalL'auteur Kefir | 2015-02-14
Vous devez vous connecter pour publier un commentaire.
Ne pas confondre les membres d'un type avec des variables. Un class/struct définition est simplement de décrire ce qui constitue un type, sans déclarer l'existence de variables, de quoi être construit sur la mémoire, rien adressable.
Dans le sens traditionnel, moderne, classe des pratiques de conception vous recommandons de faire semblant qu'ils sont des "boîtes noires": des choses, ils peuvent effectuer certaines tâches, peut-être sortie de quelques autres informations. Nous le faisons avec les méthodes de la classe tout le temps, décrivant brièvement leur signature sur le .h/.php/.hxx fichier et de cacher les détails d'implémentation de l' .rpc/.cc/.cxx fichier.
Tout la même philosophie peuvent être appliquées à des membres, l'état actuel de C++, comment les unités de traduction sont compilés individuellement rendre ce chemin plus difficile à mettre en œuvre. Il n'y a certainement rien de "out of the box", qui vous aide ici. La base, le problème fondamental est que pour presque n'importe quoi pour utiliser votre classe, il a besoin de savoir la taille en octets, et c'est quelque chose de contraint par les champs des membres et de l'ordre de déclaration. Même si elles sont privées, et rien en dehors de la portée du type devrait être en mesure de les manipuler, ils ont encore besoin d'brièvement savoir ce qu'ils sont.
Si vous voulez réellement pour cacher cette information à l'extérieur, certaines expressions idiomatiques telles que PImpl et inline PImpl peut vous aider. Mais je vous recommande de ne pas aller dans cette voie, à moins que vous êtes réellement:
Ce que la ligne directrice est en train de parler est de ne jamais déclarer des variables globales dans les en-têtes. Toute unité de traduction qui prend avantage de votre en-tête, même si indirectement, sera à la fin de la proclamation de son propre variable globale selon les instructions d'en-tête. Tout va compiler amende lorsqu'il est examiné individuellement, mais l'éditeur de liens se plaindre que vous avez plus d'une définition pour la même chose (ce qui est un gros no-no en C++)
Si vous avez besoin de réserver de la mémoire /construire quelque chose et de le lier le nom d'une variable, toujours essayer de faire que cela se produise dans le fichier source(s).
Comme il se trouve dans votre déclaration de classe, vous déclarez que il contient un InputManager dans son intégralité rien n'a été construit jusqu'à présent. Dès que vous créez un GameEngine objet dans votre runtime par le constructeur, il aura une section d'octets entièrement dédiée au stockage d'un ensemble de InputManager. Le constructeur va aussi tenter de construire un InputManager. (si vous n'avez pas explicitement expliquer comment la construire, et pas de constructeur par défaut existe, il est évident qu'il va se plaindre à ce sujet lors de la compilation) "Propriété" en C++ est un sujet trop vaste pour un commentaire.
OriginalL'auteur ZaldronGG
Membre de la classe des variables doit être déclarée dans la définition de la classe, qui est habituellement dans un fichier d'en-tête. Cela doit être fait sans aucune
extern
mots-clés, tout à fait normalement, comme vous l'avez fait jusqu'à présent.Uniquement les variables qui sont pas les membres de la classe et qui doivent être déclarés dans un fichier d'en-tête doit être déclarée
extern
.OriginalL'auteur emlai
Comme une règle générale:
Variables qui doivent être utilisés avec de nombreuses fonctions dans la même classe aller dans la déclaration de classe.
Variables temporaires pour des fonctions individuelles d'aller dans les fonctions elles-mêmes.
Il semble que
InputManager inputManager;
appartient à la classe d'en-tête.int a, b, c;
est plus difficile de savoir à partir d'ici. Quels sont-ils utilisés? Ils look comme variables temporaires qui seraient mieux dans la fonction(s) ils sont utilisés dans des, mais je ne peux pas dire pour sûr, sans contexte.extern
a aucune utilité ici.OriginalL'auteur Michael Gazonda