Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174

Перечисление в классе

08.10.2021, 16:32. Показов 2964. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использую перечисление в классе
C++
1
2
3
4
5
6
7
class myClass
{
public:
    enum En{/**/};
private:
    En f;
};
При использовании поля f в функции компилятор пишет: "не входит в область перечисления".
Советует изменить enum на enum class. В функции теперь ошибок нет. Но при попытке ввести значения поля f через cin>>, подчёркивает красным, пишет, нет соответствующего оператора.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2021, 16:32
Ответы с готовыми решениями:

Перечисление в классе вызывает ошибку
#pragma hdrstop #include <iostream.h> #include <conio.h> #include <tchar.h> ...

Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников. Сколько всего в классе учеников?
Добрый вечер! Подскажите, пожалуйста! "Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников....

В классе инициализировать массив, в классе создать функцию вывода массива на экран
Прошу помоши с выводом данных, которые содержаться в массиве, на экраy: Задача: В классе инициализировать массив, в классе создать...

16
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
08.10.2021, 16:35
Перечисления не так используются, а вне класса, это просто константы. Почитайте справку по ним.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
08.10.2021, 16:39
Цитата Сообщение от Walex Посмотреть сообщение
Но при попытке ввести значения поля f через cin>>, подчёркивает красным, пишет, нет соответствующего оператора.
C++
1
2
3
int n;
std::cin >> n;
En value = static_cast<En>(n);
1
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
08.10.2021, 16:47  [ТС]
Цитата Сообщение от FFPowerMan Посмотреть сообщение
не так используются, а вне класса
Это на основе примера из учебника Straustrupa. Он, вполне обоснованно, пишет, что если данное перечисление используется только в данном классе, то зачем его выносить в глобальную область? У него перечисление находится в классе.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.10.2021, 17:22
Цитата Сообщение от Walex Посмотреть сообщение
enum En{/**/};
приведи нормальный код,
который иллюстрирует твою проблему.

Цитата Сообщение от FFPowerMan Посмотреть сообщение
Перечисления не так используются, а вне класса, это просто константы. Почитайте справку по ним.
и откуда ты взял своё "а вне класса" ?
похоже, тебе самому справочку почитать не помешает.

так то существует даже специальный код-стайл,
согласно которому,
перечисления нужно объявлять в теле класса.
за исключением ситуаций, когда константы являются частью реализаций
за пределами одной классовой иерархии.
2
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
08.10.2021, 17:44
hoggy, а где enum хранится? Есть смысл его под static пихать?
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
08.10.2021, 17:49
Folian, если вопрос про переменную или поле класса, то всё так же, как и с другими типами
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.10.2021, 17:54
Цитата Сообщение от Folian Посмотреть сообщение
а где enum хранится?
нигде не хранится.

Цитата Сообщение от Folian Посмотреть сообщение
Есть смысл его под static пихать?
"его" - это кого?

static ортогонален перечислениям.
на объекты типа перечисления ключевое слово static влияет точно так же,
как и на любые другие объекты.
0
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
08.10.2021, 18:13
Цитата Сообщение от hoggy Посмотреть сообщение
нигде не хранится.
т.е. получается что-то вроде #define в области видимости?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.10.2021, 18:18
Цитата Сообщение от Folian Посмотреть сообщение
т.е. получается что-то вроде #define в области видимости?
да.

например, код:

C++
1
2
3
4
5
6
7
#include <iostream>
enum eOLOLO { eTROLOLO = 666 };
 
int main()
{
    std::cout << eTROLOLO;
}
аналогичен:

C++
1
2
3
4
5
6
7
8
#include <iostream>
 
#define eTROLOLO 666
 
int main()
{
    std::cout << eTROLOLO;
}

принципиальная разница в том,
что за define отвечает препроцессор,
который ничего не знает о синтаксисе с++
в то время как за перечисления отвечает компилятор.
поэтому можно использовать проверку типов,
реализовывать перегрузку,
значения enum можно использовать в шаблонном-мета-программировании,
и тп.
1
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
08.10.2021, 18:28
Цитата Сообщение от hoggy Посмотреть сообщение
что за define отвечает препроцессор,
который ничего не знает о синтаксисе с++
в то время как за перечисления отвечает компилятор.
Примерно так я и понял.
Т.е. нафиг static для enum.

Премногоблагодарен.
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
09.10.2021, 04:17  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
приведи нормальный код,
который иллюстрирует твою проблему.
Привожу, но логики особой не ищите. Я сюда, по заданию учебника понапихал всякого, чего сам не использую.
Задание - создать библиотеку с книгами.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <string>
#include<fstream>
#include<vector>
using namespace std;
 
class myDate //выделил дату написания книги в отдельный класс
{   
public:
    class Invalid {};//для ловли ошибок даты. Ещё не использовал в коде
    enum class Month {
        jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
    };
    myDate() {};
    myDate(int y, Month m, int d) :yar(y), ma(m), de(d)
    {
        if (!is_date(y, m, d))throw Invalid();
    };
    int year() const { return yar;}
    void year(int a) { yar = a; };
    Month month()const { return ma;}
    void month(Month m) { ma = m;}
    int dey()const { return de;}
    void dey(int b) { de = b; }
    bool is_date(int y, Month m, int d);
private:
    int yar;
    Month ma;
    int de;
 
};
class Book
{
public:
    string ISBN;
    string Name_awtor;
    string Ident;
     myDate t;
    bool Flag;// выдана книга или стоит на полке
 
    Book() {};
    Book(string IS, string Nam, string Id) :ISBN(IS), Name_awtor(Nam), Ident(Id), Flag(true) //пробовал инициировать через //конструктор, не получается, ещё не разбирался, почему
    {}
    
};
class Bibl
{
public:
    vector<Book> ff; //полка для книг
    void Push(Book& F);
};
ostream& operator <<(ostream& os, Book& d);
bool operator ==(Book& a, Book& b);
int main()
{
    setlocale(LC_ALL, "Rus");
    cout << "Введите ISBN книги, имя автора, название книги, дату выпуска " << endl;
    Bibl bibl;
    while (cin)
    {
        Book Bb; 
        myDate::Month bb;
        int a,b, c;
        cin >> Bb.ISBN >> Bb.Name_awtor >> Bb.Ident >> a >> b >> c;// вот здесь не работала, если перечисление -   //класс
        bb = static_cast<myDate::Month>(b);
        Bb.t.year(a); Bb.t.month(bb); Bb.t.dey(c);
        bibl.Push(Bb);
    }
    cin.clear();
    for (auto a : bibl.ff)
        cout << a;
    return 0;
}
 
ostream& operator<<(ostream& os, Book& d)
{
    if (d.Flag) cout << "Книга на полке" << endl;
    else cout << "книга выдана" << endl;
    return os << '(' << d.ISBN << ", " << d.Name_awtor << ", " << d.Ident << ", "
        << d.t.year() << ", " << static_cast<int>(d.t.month()) << ", " << d.t.dey(); 
}
 
bool operator==(Book& a, Book& b)
{
    return a.ISBN==b.ISBN;
}
 
bool myDate::is_date(int y, Month m, int d)
{
    if(1800>y||y>2050)return false;
    if (m < myDate::Month::jan || myDate::Month::dec < m)return false;
    if (d < 1 || 31 < d)return false;
    return true;
}
 
void Bibl::Push(Book& F)
{
    ff.push_back(F);
}
Код ещё толком не отлажен, но сейчас, за счёт static_cast работает.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2021, 04:29
Цитата Сообщение от Walex Посмотреть сообщение
Привожу
ну и что ты привел?
портянку кода, который никак не иллюстрирует проблему.

Цитата Сообщение от Walex Посмотреть сообщение
При использовании поля f в функции компилятор пишет: "не входит в область перечисления".
представленный тобой код успешно компилируется.

выброси всё, что не имеет отношения к озвученной тобой проблеме.
и продемонстрируй ошибку.
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
09.10.2021, 04:54  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
выброси всё, что не имеет отношения к озвученной тобой проблеме.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class myDate
{   
public:
    class Invalid {};
    enum  Month {
        jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
    };
    myDate() {};
    myDate(int y, Month m, int d) :yar(y), ma(m), de(d)
    {
        if (!is_date(y, m, d))throw Invalid();
    };
private:
    int yar;
    Month ma;
    int de;
 
};
В таком виде пишет, что Month ma не входит в область перечисления.
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
09.10.2021, 06:14
Walex, если закрыть глаза на всякие новичковые ошибки, то это компилится

https://onlinegdb.com/VigIpNwJI

про какую ошибку речь?
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
09.10.2021, 08:05  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
про какую ошибку речь?
Я не знаю, в чём проблема, но у меня при запуске этой программы выдавалась единственная ошибка: переменная поля перечисления не входит в указанное выше перечисление. Я изменил на перечисление- класс, остальное работало.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2021, 12:53
Цитата Сообщение от Walex Посмотреть сообщение
В таком виде пишет, что Month ma не входит в область перечисления.
нет, не пишет.
этот код так же ничего не иллюстрирует.
а кроме того, в нем отсутствуют необходимые запчасти.

вот например:
Цитата Сообщение от Walex Посмотреть сообщение
if (!is_date(y, m, d))throw Invalid();
без функции is_date код нельзя скомпилировать.
предлагаешь формучанам самостоятельно её дописать?
или почему ты не выложил нормальный код?

Цитата Сообщение от Walex Посмотреть сообщение
у меня при запуске этой программы выдавалась единственная ошибка
ты ничего не перепутал?

есть разница:
- ошибка в процессе сборки,
- ошибка при запуске готовой программы.

ты так и не привел код, который крашит сборку.
а вот при запуске никаких подобных ошибок не может быть в принципе.


учись локализировать проблему.
"нормальный код" - это минимальный по объему код,
который содержит все необходимые запчасти,
и иллюстрирует проблему.

Цитата Сообщение от Walex Посмотреть сообщение
Я не знаю, в чём проблема
Цитата Сообщение от Walex Посмотреть сообщение
Я изменил на перечисление- класс, остальное работало.
в настоящий момент ты по прежнему не понимаешь суть возникшей проблемы.
ты применил решение без понимания того, как оно работает.

ты можешь двигаться дальше,
но тогда у тебя в голове останется пробел в образовании.

или ты можешь разобраться с проблемой:
и только потом двигаться дальше,
уже с пониманием темы enum.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2021, 12:53
Помогаю со студенческими работами здесь

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У меня есть объект pl класса Player,это...

как в новом классе использовать элементы заданные в другом классе?
import java.awt.*; import java.awt.event.*; import static java.awt.Color.*; import java.util.*; class L { /*Допустим, что...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot. Скажите как объявить, что бы один из...

Помогите реализовать метод закраски, чтобы он был в классе и вызывался в другом классе
Помогите реализовать метод закраски, чтобы он был в классе и вызывался в другом классе

Как изменить название кнопки в классе dialog при нажатии на кнопку в классе mainwindow
Добрый день, я около месяца как начал изучать QT, то есть новичок. Собственно дело в следующем, создал новый проект (Приложение -&gt; qt...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru