Доступ к внутреннему значению перечисления вне пространства имен

0

Учитывая следующий минимальный пример:

foo.hpp:

class foo {       
    public:       
        enum bar {
            ONE,  
            TWO,  
            THREE 
        };        
        bar b;    
        foo ();   
};          

foo.cpp:

#include "foo.hpp"       

foo::foo () : b(ONE) { } 

Как я могу сделать то, что я пытаюсь сделать ниже?

#include "foo.hpp"        

int main () {             
    foo *f = new foo();   
/* None of these work:    
    f->b = TWO;           
    f->b = foo::bar::TWO; 
    f->b = bar::TWO;      
*/                        
    return 0;             
}                         

Я склоняюсь к выводу, что это не идиоматично в C++, и я должен обернуть enum классом во внешнем пространстве имен или иначе реорганизовать. Каковы варианты и/или передовая практика?

Теги:
enums
nested

3 ответа

5
Лучший ответ
f->b = foo::TWO; 

должно сработать

  • 0
    Для пояснения: значения enum являются членами входящего в их пространство имен (которое в данном случае является классом foo ), если enum не объявлен как enum class bar (в этом случае они будут названы как foo::bar::TWO ).
  • 0
    Почему я думал, что bar::TWO стоит попробовать, но не foo::TWO Я не знаю. Благодарю.
Показать ещё 1 комментарий
1

В C++ до C++ перечислены 11 перечислений (само имя перечисления и значения) в области охватывающего пространства имен/класса.

Таким образом, вы получите доступ к нему как: f->b = foo::TWO; (как видно из другого ответа).

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

class foo {       
    public:       
        struct bar {
            enum Type {
            ONE,  
            TWO,  
            THREE  }
        };        
        bar::Type b;    
        foo ();   
};          

Теперь вы можете присвоить имя своему помощнику структуры.

#include "foo.hpp"        

int main () {             
    foo *f = new foo();   
    f->b = foo::bar::TWO; 

    return 0;             
}                         
0

Перечислители являются членами класса. Таким образом, вы можете написать либо как

f->b = foo::TWO;

или

f->b = f->TWO;

или даже как

f->b = foo::bar::TWO;

при условии, что ваш компилятор поддерживает стандарт C++ 2011

Ещё вопросы

Сообщество Overcoder
Наверх
Меню