C ++: эквивалентно «использованию пространства имен <namespace>», но для классов? - PullRequest
3 голосов
/ 12 ноября 2009

Предположим, у вас есть класс с определенным в нем перечислением:

class MyClass {
  typedef enum _MyEnum{ a } MyEnum;
}

Есть ли способ получить доступ к значению a из другого класса, не ссылаясь на него как MyClass :: a? Если перечисление содержалось в пространстве имен, а не в классе, а не «используя пространство имен»; решает проблему - есть ли эквивалентный способ сделать это с классами?

Ответы [ 5 ]

4 голосов
/ 12 ноября 2009

Я почти уверен, что вы застряли с «MyClass :: a». Кроме того ... разве такого рода поражение не ставит целью поставить перечисление внутри класса?

3 голосов
/ 12 ноября 2009

Лучшее, что вы можете сделать, это потянуть отдельные символы в класс.

class SomeClass {
    typedef MyClass::MyEnum MyEnum;
    MyEnum value;
};

Обратите внимание, что если typedef находится в публичном разделе класса, тогда любой может сослаться на SomeClass::MyEnum как синоним MyClass::MyEnum.

1 голос
/ 12 ноября 2009

Альтернативой может быть публичное наследование от Enum-holder -класса:

struct Holder {
    enum MyEnum { a };
};

class User : public Holder {
public:
    // a now visible in class
    MyEnum f() { return a; } 
};

// a visible outside too
User::MyEnum f() { return User::a; }
0 голосов
/ 12 ноября 2009

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

class MyClass {
  public:
  // I added a value here intentionally to show you what to do with more than one enum value
  typedef enum _MyEnum{ a, b } MyEnum;
}
using MyClass::a;
using MyClass::b;
//... likewise for other values of the enum
0 голосов
/ 12 ноября 2009

Если только другой класс не является производным классом MyClass (а ваше перечисление защищено / public), нет. Я знаю, что это не ответ, но, по моему мнению, перечисление определено внутри MyClass по какой-то причине, поэтому не пытайтесь сделать его доступным глобально.

...