8
votes

Comment définir une énumération à l'intérieur d'une classe et l'utiliser de l'extérieur

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 {gauche = 1, droite = 2, top = 3, bas = 4} ) à 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 ...

est-ce que je peux faire cela, ou y a-t-il une meilleure façon de faire Ce que je peux rendre l'énumération spécifique à cette classe seulement?

Voici le code qui ne fonctionne pas, disant Enum mysprite :: << iname> myysprite :: Membre latéral MySprite "MySprite: : côté "n'est pas un nom de type pour une raison quelconque: xxx


1 commentaires

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 est défini. Cela vient d'une tierce partie. Voir aussi C ++ Typedef Enum de classe d'une autre classe?


3 Réponses :


2
votes

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);


7 commentaires

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 au lieu de si .


Space_c0wb0y: non pertinent et non important.


Son disant Enum mySprite :: myysprite :: côté et ce membre MySprite "mysprite: latéral" n'est pas un nom de type ...


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 d'un type d'énumération sans nom dans la classe. La fonction void f (instructions); est incorrect car instructions n'est pas un type. Vous vouliez probablement dire: instructions enum {...};



-1
votes

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);
    //...
}

 


4 commentaires

@Casey, il manque le nom Typedef-ed, en plus d'être inutile. Vous devez soit utiliser: Enum direction {...}; ou TypeEf Enum direction {...} xxx; xxx peut être < Code> Direction ou tout autre nom que vous souhaitez fournir, mais la syntaxe Typedef nécessite 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 n'est pas le nom d'une variable facultative, mais le nom Typedef-name (§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 mais acceptent le code. Je n'ai pas été en mesure de confirmer si le Typedef-Name est requis dans la définition de type si Typedef 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 Un nom , je suppose que s'il est requis , 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?



6
votes

Le changement le plus simple nécessaire pour que votre code fonctionne est celui-ci:

    typedef enum {left = 1, right, top, bottom} side;


5 commentaires

+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é;


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 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. :)