Я чувствую, что это простой вопрос, но я, кажется, не нахожу ответа сам. Мне было интересно, есть ли способ использовать перечисление в другом файле без использования области видимости?
например Head.h
namespace h{
class Eye{
enum class State{
closed = 0, blinking, open, staring, rolling // etc.
};
void print(const State &eye);
};
class Body{
Eye::State eye;
Eye::State eyesOpen();
};
}
Head.cpp
namespace h{
void Eye::print(const State &eye){
switch(eye){
case Eye::State::closed: cout << "Closed" << endl;
case Eye::State::blinking: cout << "Blinking" << endl;
case Eye::State::open: cout << "Open" << endl;
}
bool Body::eyesOpen(){
return eye == Eye::open;
}
}
Я использую Eye::State более 80 раз в своем классе Body, поэтому мне было интересно, есть ли способ просто указать, что State
есть Eye::State
, вместо того, чтобы писать это 80 раз?
Редактировать: Eye
и Body
— два отдельных класса. Просто Body
использует объект Eye
Вам даже не нужен псевдоним типа для любых ссылок другими членами того же класса. State::closed
, эт. al., в показанном коде, будет работать как есть.
Имейте в виду, однако, что если вы указываете псевдоним делать таким образом, это должно быть сделано не только для удобства, но тип с псевдонимом должен соответствовать охватывающему типу (или пространству имен). В данном примере это не так; или что означает мигающее тело (Body::State::Blinking
)???
Боковое примечание: функция print
довольно неудачна, так как она принудительно печатает в std::cout
— что, если вы собираетесь печатать, например. файл? Лучше: Реализуйте ostream& operator<<(ostream& s, Eye::State state)
, тогда вы сможете сделать Eye::State s; std::cout << s;
или то же самое для любого другого потока.
@molbdnilo, так что это должно работать, если я поставлю псевдоним вверху пространства имен?
@SamVarshavchik они находятся в двух разных классах, но в одном пространстве имен
Ну, код, который вы показал в основном использовали Eye::State
внутри класса Eye
, где комментарий Сэма абсолютно правильный. Тот факт, что ваш текст описывает проблему, не видимую в вашем примере кода, не идеален.
Возможная опечатка, кажется, что Body::eyesOpen
возвращает Eye::State
в заголовке, но возвращает bool
в файле cpp.
@molbdnilo Я думаю, если бы Eye был в другом пространстве имен, вы все равно могли бы сделать using State Other::Eye::State;
?
Не помещайте псевдоним типа в начало пространства имен, если это действительно не та логическая область, которую вы хотите.
Если вы просто хотите сохранить ввод Body
методов, которые вы не показали, просто
namespace h{
class Body{
using State = Eye::State;
State eye;
State eyesOpen();
};
}
будет работать. Кажется странным, что глаза — единственный орган этого тела, состояние которого имеет значение. Если вам действительно нужно больше состояний органов позже, вы можете удалить псевдоним уровня класса и просто написать
bool Body::eyesOpen() {
using State = Eye::State;
return eye == State::open;
}
(что вообще не является улучшением, но представьте, что оно применяется к другим 80 экземплярам, которые вы нам не показали).
спасибо, добавление использования в начале класса сработало!
Используйте псевдоним обычного типа,
using State = Eye::State;