Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> enum в классе 
V
    Опции темы
Hagrael
Дата 22.7.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Имеется код:
Код

class cPlayer {
    public:
        cPlayer::ePlayerStatus currentStatus;
    private:
        enum ePlayerStatus {STAND = 0, BLOCK = 1};
};

Компилятор ругается. Говорит "ePlayerStatus in class cPlayer does not name a type". Перевести это я могу (вроде smile): "ePlayerStatus в классе cPlayer не обозначает тип" (хотя возможно я даже конкурентноспособнее, чем Google Translate! smile). Но почему выдается такая ошибка? Если я объявляю ePlayerStatus вне класса, то все ОК, а когда заношу внутрь, то все ломается.

Заранее благодарен.
PM MAIL   Вверх
boostcoder
Дата 22.7.2011, 19:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Код

   
class cPlayer {
   enum ePlayerStatus {STAND = 0, BLOCK = 1};
public:
   ePlayerStatus currentStatus;
};

int main() {
   cPlayer p;
}

http://liveworkspace.org/code/76ff542aa7bf...485693c50adcf77

Добавлено через 7 минут и 28 секунд
Цитата(Hagrael @  22.7.2011,  19:16 Найти цитируемый пост)
ePlayerStatus in class cPlayer does not name a type

ePlayerStatus в классе cPlayer не является именем типа.
PM WWW   Вверх
Hagrael
Дата 22.7.2011, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Спасибо.
PM MAIL   Вверх
bsa
Дата 22.7.2011, 20:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Hagrael, скажу тебе сразу, что подобное смысла не имеет. Так как пользоваться currentStatus из-вне (а иначе зачем в public) будет очень затруднительно.
PM   Вверх
Hagrael
Дата 22.7.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



bsa, только что именно это я и заметил smile Не уже ли для этого нужно создавать глобальный enum? Просто будет не очень красиво.
PM MAIL   Вверх
boostcoder
Дата 22.7.2011, 20:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Код

   
class cPlayer {
public:
   enum ePlayerStatus { STAND = 0, BLOCK = 1 };
   
   ePlayerStatus currentStatus;
};

int main() {
   cPlayer p;
   cPlayer::ePlayerStatus e = cPlayer::STAND;
}

http://liveworkspace.org/code/03eac72912d9...1f81cf2290c7094

Добавлено через 10 минут и 44 секунды
Hagrael, объясни, чего хочешь добиться?
PM WWW   Вверх
borisbn
Дата 22.7.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



шлифовать, так шлифовать smile

Код

class cPlayer {
public:
    enum ePlayerStatus { STAND = 0, BLOCK = 1 };
    ePlayerStatus currentStatus() const {
        return m_currentStatus;
    }
    void setCurrentStatus( const ePlayerStatus & s ) {
        m_currentStatus = s;
    }
private:
    ePlayerStatus m_currentStatus;
};


P.S.  smile 
Цитата(Hagrael @  22.7.2011,  19:16 Найти цитируемый пост)
cPlayer

Цитата(Hagrael @  22.7.2011,  19:16 Найти цитируемый пост)
ePlayerStatus

именование типов - жуть... венгерщиной попахивает smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 22.7.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  22.7.2011,  20:10 Найти цитируемый пост)
шлифовать, так шлифовать 

я бы еще вынес enum наружу, например так :
Код

namespace  PlayerStatus { 
 enum еNum { STAND = 0, BLOCK = 1 };

typedef PlayerStatus::еNum ePlayerStatus;

class cPlayer {
public:
  
  cPlayer () : currentStatus (PlayerStatus::STAND) 
  {}
   
  ePlayerStatus currentStatus;
};



P.S. имена состоящие из всех заглавнных букв "закреплены" за макросами, поэтому с этим стоит быть поосторожней, чтоб не нарваться на необъснимую ошибку.. 



--------------------
PM MAIL WWW   Вверх
Alca
Дата 23.7.2011, 00:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Цитата

я бы еще вынес enum наружу

зачем?


--------------------
PM WWW ICQ Skype Jabber   Вверх
boostcoder
Дата 23.7.2011, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



borisbnmes, может просто почитать про "enum class" ;)
например тут: http://www.open-std.org/jtc1/sc22/wg21/doc.../2007/n2347.pdf

Добавлено @ 00:30
Alca, перешел по ссылке у тебя в подписи, а там внизу страницы есть такое:
user posted image
ну добавь readme. а то реально не понятно что за либа.


Это сообщение отредактировал(а) boostcoder - 23.7.2011, 00:30
PM WWW   Вверх
volatile
Дата 23.7.2011, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(mes @  22.7.2011,  23:56 Найти цитируемый пост)
namespace  PlayerStatus { 
 enum еNum { STAND = 0, BLOCK = 1 };

typedef PlayerStatus::еNum ePlayerStatus;

mes, а какой смысл заключать в namespace, и тут же делать синоним в global scope?
т.е. в чем разница, с этим:
Код

enum ePlayerStatus { STAND = 0, BLOCK = 1 };


PM MAIL   Вверх
Hagrael
Дата 23.7.2011, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  22.7.2011,  21:10 Найти цитируемый пост)
именование типов - жуть... венгерщиной попахивает

А вы бы как это оформили, можете показать? (или то, как вы написали, и есть ваш вариант?)

Цитата(boostcoder @  22.7.2011,  20:53 Найти цитируемый пост)
cPlayer::ePlayerStatus e = cPlayer::STAND;

Обращение через cPlayer::... Значит, нельзя присвоить enum классу, а после обращаться к его "вариантам" напрямую (без cPlayer::). Тогда буду делать enum глобальным.
PM MAIL   Вверх
borisbn
Дата 23.7.2011, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Hagrael @  23.7.2011,  07:32 Найти цитируемый пост)
А вы бы как это оформили, можете показать?

Код

class Player {
public:
    enum Status { STAND = 0, BLOCK = 1 };
    Status currentStatus() const {
        return m_currentStatus;
    }
    void setCurrentStatus( const Status & s ) {
        m_currentStatus = s;
    }
private:
    Status m_currentStatus;
};

А чтобы не пересекаться с каким-нибудь другим плеером заключить весь класс в namespace с названием проекта (или ещё какм-нить)

Цитата(Hagrael @  23.7.2011,  07:32 Найти цитируемый пост)
Обращение через cPlayer::... Значит, нельзя присвоить enum классу, а после обращаться к его "вариантам" напрямую (без cPlayer:smile

обращаться можно (см. typedef от mes), но IMHO так ( с Player:: ) будет более читабельно... Сразу понятно о каком статусе идёт речь.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 23.7.2011, 10:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(boostcoder @  22.7.2011,  23:20 Найти цитируемый пост)
 может просто почитать про "enum class" ;)

Вы думаете мы не в курсе ? ;) или считаете, что новичков с ходу надо грузить новым стандартом ? 

Цитата(Alca @  22.7.2011,  23:13 Найти цитируемый пост)
Цитата

я бы еще вынес enum наружу

зачем? 

чтоб не нагружать класс плеера тем, что к нему относится косвенно.. 

Цитата(volatile @  23.7.2011,  00:22 Найти цитируемый пост)
 а какой смысл заключать в namespace, и тут же делать синоним в global scope?
т.е. в чем разница, с этим:
Код

enum ePlayerStatus { STAND = 0, BLOCK = 1 }; 
 

namespace нужен, чтоб вынести константы енума из глобальной области видимости, для повышения читабельности и исключения пересечений.. 
а typedef для того чтоб был более удобный тип ePlayerStatus вместо PlayerStatus::eNum..

Добавлено через 4 минуты и 56 секунд
Цитата(borisbn @  22.7.2011,  20:10 Найти цитируемый пост)
    ePlayerStatus currentStatus() const {
        return m_currentStatus;
    }
    void setCurrentStatus( const ePlayerStatus & s ) {

старайтесь избегать интерфейса в виде сочетаний геттера и сеттера.. если нужно только это то лучше оформить как структурный блок данных, а не как класс..
касательно текущего вопроса, то, имхо, наиболее подходящим будет использование геттера и нескольких методов изменяющих состояние вместо сеттера..

Добавлено через 7 минут и 31 секунду
Цитата(borisbn @  23.7.2011,  08:18 Найти цитируемый пост)

Цитата
а после обращаться к его "вариантам" напрямую

обращаться можно (см. typedef от mes)

как typedef поможет обращаться к "вариантам" енума напрямую ?




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 23.7.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  23.7.2011,  10:34 Найти цитируемый пост)
Вы думаете мы не в курсе ? ;)

smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.