Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2015, 17:42   #1
Dudki
 
Регистрация: 24.01.2015
Сообщений: 7
По умолчанию Помогите, пожалуйста, понять enum.

Приветствую!
Занимаюсь самостоятельно, для души, по учебнику Праты.
Упражнение.
Есть такой код заголовка:
Код:
#ifndef STONEWT_H_
#define STONEWT_H_
class Stonewt
{
private:
    enum {Lbs_per_stn = 14};      
    int stone;                    
    double pds_left;              
    double pounds; 
    enum md {S, IP, DP};             
public:
   
	Stonewt(double lbs);          
    Stonewt(int stn, double lbs); 
    Stonewt();                    
    ~Stonewt();
       
    void set_mode (); 
    friend std::ostream & operator << (std::ostream os,  const Stonewt & ob);
};
#endif
Есть вот такая реализация конструктора:
Код:
Stonewt::Stonewt(double lbs)
{
    stone = int (lbs) / Lbs_per_stn;    // integer division
    pds_left = int (lbs) % Lbs_per_stn + lbs - int(lbs);
    pounds = lbs;
    md = IP;
}
на которую компилятор блажит:
expected unqualified-id before '=' token
И есть вот такая вот реализация функции:
Код:
std::ostream & operator<<(std::ostream os,  const Stonewt & ob)
 {
 	if (ob.md = S)
 	os <<"Mode is Stone, "<<ob.stone<<std::endl;
 	if (ob.md = IP)
 	os <<"Mode is IP, "<<ob.pounds<<std::endl;
 	else 
 	os <<"Mode is DP, "<<ob.pounds<<"."<<ob.pds_left<<std::endl;
 }
на которую он выдает:
[Error] invalid use of 'enum Stonewt::md'

Гуглился интернет, листались книги, и кажется, что все отлично, но так и не удалось "воткнуть", как же так надо использовать перечисления, чтобы компилятор съел.
Не подскажите?

P.S. Извините, не заметил тут сразу раздел для новичков как-то. Прошу перенести, если нужно. С уважением.

Последний раз редактировалось Dudki; 24.01.2015 в 18:02.
Dudki вне форума Ответить с цитированием
Старый 24.01.2015, 18:29   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
enum {Lbs_per_stn = 14}; // зачем enum?
const unsigned Lbs_per_stn = 14;
...
enum md {S, IP, DP}; // это объявление типа
enum {S, IP, DP} md; // а это переменной
...
if (ob.md = S) // это присваивание
if (ob.md == S) // а это сравнение
Somebody вне форума Ответить с цитированием
Старый 24.01.2015, 19:14   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Код:
enum {Lbs_per_stn = 14}; 
//const unsigned Lbs_per_stn = 14; //зачем переменная?
Одна из особенностей enum : он объявляет константы времени компиляции.
Это означает, что у вас есть 100% гарантия того, что значения будут вычислены именно времени компиляции, и не создадут нагрузку на рантайм.

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

В случае с обычными неизменяемыми переменными: зависит от контекста. Компилятор может оптимизировать. А может и не оптимизировать.
_Bers вне форума Ответить с цитированием
Старый 24.01.2015, 23:31   #4
Dudki
 
Регистрация: 24.01.2015
Сообщений: 7
По умолчанию

Цитата:
enum {Lbs_per_stn = 14}; // зачем enum?
В учебнике написано, что значения должны хранить поля объектов класса, а в самом классе констант быть не должно. Чтобы обойти это ограничение и ввелась такая форма.

Спасибо за нелишнее напоминание разницы между присваиванием и сравнением, а так же за объяснение работы с enum. Я только не пойму, почему в книге в другом примере записано именно как объявление типа.
Вот допустим:
Код:
public:
        enum Mode {RECT, POL};
Кусок реализации конструктора:
Код:
Vector::Vector()             // default constructor
    {
        x = y = mag = ang = 0.0;
        mode = RECT;
    }
Dudki вне форума Ответить с цитированием
Старый 24.01.2015, 23:49   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Там тогда, наверное, ещё где-то объявление
Код:
Mode mode;
?
Somebody вне форума Ответить с цитированием
Старый 25.01.2015, 01:06   #6
Dudki
 
Регистрация: 24.01.2015
Сообщений: 7
По умолчанию

Цитата:
Там тогда, наверное, ещё где-то объявление
да! нашлось!
Dudki вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в цикле , не могу понять в чем! Помогите пожалуйста. Алексей_xXx Помощь студентам 1 29.05.2009 00:37
задача на массив решите пожалуйста не могу ни как понять LIL_VAdiK Помощь студентам 2 18.02.2009 23:40
Не могу понять почему не идет сортировка файла, помогите пожалуйста Taisja Помощь студентам 2 15.06.2008 20:37
Помогите пожалуйста не могу понять! Kosoy135 Паскаль, Turbo Pascal, PascalABC.NET 7 28.12.2007 19:08