как определить перечисление внутри класса и использовать его извне - PullRequest
6 голосов
/ 19 июня 2011

Просто потому, что я не знаю точно, где это можно найти в моей книге на С ++ или в Google. Как на самом деле определить некоторые перечисления (в данном случае { left=1, right=2, top=3, bottom=4 }) внутри класса. Я хочу иметь возможность передавать это перечисление в качестве параметра функциям-членам вместо целого числа, поэтому использование перечисления извне ...

Есть ли способ, которым я могу сделать это, или есть лучший способ, которым я могу сделать перечисление специфичным только для этого класса?

Вот код, который не работает, по какой-то причине он говорит enum mySprite::<unamed> myySprite::side member mySprite "mySprite::side" is not a type name:

class mySprite : public sf::Sprite
{
public:
    enum{left=1, right=2, top=3, bottom=4} side;

    float GetSide(side aSide){
        switch(aSide){
            // do stuff
        }
    };
};

Ответы [ 3 ]

6 голосов
/ 19 июня 2011

Самое простое изменение, необходимое для работы вашего кода, это:

class mySprite : public sf::Sprite
{
public:
    enum side{ left=1, right=2, top=3, bottom=4 };

    float GetSide(side aSide)
    {
        switch(aSide)
        {
            // do stuff
            // add breaks; as appropriate
            case left:
            case right:
            case top:
            case bottom:
        }
    }
};

Вы также можете сделать это следующим образом:

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

Что означает определение анонимного типа enum для вашего mySprite класса и создание side псевдонима, эффективно выполняющего то же самое, что и код выше. Для краткости только первому значению перечисления должно быть присвоено начальное целое число. Все значения, которые следуют после этой точки, считаются увеличенными на 1 каждый раз, если вы явно не назначите ему что-то еще.

1 голос
/ 19 июня 2011

Я думаю, этот пример объясняет все это:

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);
0 голосов
/ 19 июня 2011

Вам нужно определить его как тип, чтобы использовать его вне класса и / или строго ввести тип параметра. В противном случае он просто определяется как int, его модификатор доступа также должен быть открытым:

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

 
...