Juste parce que je ne sais pas exactement où chercher cela dans mon livre C ++ ou sur Google. Comment définir réellement certaines énumérations (dans ce cas Voici le code qui ne fonctionne pas, disant {gauche = 1, droite = 2, top = 3, bas = 4} code>) à l'intérieur d'une classe. Je veux pouvoir transmettre cette énumération en tant que paramètre aux fonctions des membres au lieu d'un entier, en utilisant donc l'énumération externe ...
Enum mysprite :: << iname> myysprite :: Membre latéral MySprite "MySprite: : côté "n'est pas un nom de type code> pour une raison quelconque: p>
3 Réponses :
Je pense que cet exemple explique tout cela:
class A { public: enum directions { top, left, right, bottom }; // directions is the type // of the enum elements void f(directions dir) { if (dir == left) { // ... } else { // ... } } }; A object; object.f(A::top);
Non, ça ne le fait pas, car l'Enum est privé par défaut :)
Ugh, tu me suis là, mais hah tu as oublié que j'ai oublié un point-virgule à la fin de la classe (c'est édité maintenant).
Et aussi, puisque vous utilisez un énorme, vous voulez probablement utiliser commutateur code> au lieu de
si code>.
Space_c0wb0y: non pertinent et non important.
Son disant Enum mySprite ::
D'accord, j'ai posté un autre code, la chose soulignée en rouge est "côté" dans la fonction.
@nightcracker: La syntaxe est fausse, vous déclarez un membre unique instructions code> d'un type d'énumération sans nom dans la classe. La fonction
void f (instructions); code> est incorrect car
instructions code> n'est pas un type. Vous vouliez probablement dire:
instructions enum {...}; code>
Vous devez le définir en tant que type pour l'utiliser en dehors de la classe et / ou de saisir fortement le paramètre. Sinon, il est simplement défini comme un int code>, son modificateur d'accès doit également être public:
class foo {
public:
typedef enum DIRECTION {
LEFT = 1,
RIGHT,
TOP,
BOTTOM,
};
void SetDirection(foo::DIRECTION dir) {
_direction = dir;
}
//...
protected:
//...
private:
foo::DIRECTION _direction;
//...
};
int main() {
//...
foo bar;
bar.SetDirection(foo::BOTTOM);
//...
}
@Casey, il manque le nom Typedef-ed, en plus d'être inutile. Vous devez soit utiliser: Enum direction {...}; code> ou
TypeEf Enum direction {...} xxx; code> où
xxx code> peut être < Code> Direction Code> ou tout autre nom que vous souhaitez fournir, mais la syntaxe Typedef nécessite i> ce nom.
@Lutz: Je ne sais pas qui vous a dit ça, mais tout Typedef exige est un type, c'est-à-dire "Enum" et un synonyme I.e "Direction {...}". Le "xxx" que vous vous référez est une variable facultative pouvant être créée. S'il n'est pas utilisé et laissé vide comme dans l'exemple, aucune variable n'est créée.
@Casey: le xxx code> n'est pas le nom d'une variable facultative, mais le nom Typedef-name i> (§7.1.3), et c'est le nouveau alias / i> nom pour le type. J'ai vérifié le code dans trois compilateurs (G ++ 4.2, Clang ++ et Comeau), et deux d'entre eux Avertissez i> mais acceptent le code. Je n'ai pas été en mesure de confirmer si le Typedef-Name i> est requis dans la définition de type si
Typedef code> est présent, mais comme il est accepté sur les compilateurs, il pourrait être facultatif. Fait intéressant, l'avertissement est le suivant: AVERTISSEMENT: TYPEDEF Nécessite B> Un nom i>, je suppose que s'il est requis b>, il devrait s'agir d'une erreur en cas d'erreur.
idk mais ce code a travaillé pour moi dans MSVS ++ .... D'autres problèmes seront-ils apparus ou quelque chose?
Le changement le plus simple nécessaire pour que votre code fonctionne est celui-ci:
typedef enum {left = 1, right, top, bottom} side;
+1, au moins celui-ci est syntaxiquement correct! (BTW, une troisième alternative est la suivante: Typef Enum Side {Gauche = 1, droite, Top, Bottom} côté; code>
Et alors que c'est une troisième alternative, il est également redondant en C ++. Techniquement, le typedef lui-même est redondant en C ++ (dans ce cas), mais cela n'a pas d'importance à la fin. Un compilateur doit être suffisamment intelligent pour la comprendre de toute façon. :)
@David Je suis surpris que l'OP ait accepté une réponse syntaxiquement incorrecte. Un compilateur conforme aura simplement rejeter ce code et lui donnera encore plus d'erreurs à traiter.
@Chrono Kitsune: Ce n'est pas Exactement i> redondant, il y a une différence entre le nom de l'énumé ou le typedef. La différence entre C et C ++ Recherche est qu'après avoir échoué à localiser un nom dans l'espace d'identification général, en C ++, l'espace d'identificateur de types définis par l'utilisateur est vérifié. Si vous êtes intéressé, je peux creuser une explication plus longue (ou localiser un à deux)
Non, merci. Je suis sûr que vous êtes tout à fait correct. Après tout, il est logique de faire exactement ce que vous avez dit. Merci pour l'information. :)
Malheureusement, aucune des réponses ne doit expliquer comment le taper lorsque vous ne pouvez pas modifier le fichier d'en-tête où
mySprite code> est défini. Cela vient d'une tierce partie. Voir aussi C ++ Typedef Enum de classe d'une autre classe?