Учитывая следующий минимальный пример:
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 классом во внешнем пространстве имен или иначе реорганизовать. Каковы варианты и/или передовая практика?
f->b = foo::TWO;
должно сработать
В 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;
}
Перечислители являются членами класса. Таким образом, вы можете написать либо как
f->b = foo::TWO;
или
f->b = f->TWO;
или даже как
f->b = foo::bar::TWO;
при условии, что ваш компилятор поддерживает стандарт C++ 2011
foo
), если enum не объявлен какenum class bar
(в этом случае они будут названы какfoo::bar::TWO
).bar::TWO
стоит попробовать, но неfoo::TWO
Я не знаю. Благодарю.