Перечисление C ++ - PullRequest
       15

Перечисление C ++

2 голосов
/ 18 апреля 2010

мой вопрос о перечислении, мои коды:

#include<iostream>
using namespace std;
int main()
{
    enum bolumler {programcilik,donanim,muhasebe,motor,buro} bolum;
    bolum = donanim;
    cout << bolum << endl;
    bolum += 2;  // bolum=motor
    cout << bolum;

    return 0;
}

Вывод должен быть 1 3 но в соответствии с этими кодами ошибка:

 error C2676: binary '+=' : 'enum main::bolumler' does not define this operator or a conversion to a type acceptable to the predefined operator
Error executing cl.exe.

111.obj - 1 error(s), 0 warning(s)

Можете ли вы мне помочь? Другой вопрос, что я могу сделать, если я хочу видеть вывод, как этот "muhasebe"?

Ответы [ 5 ]

1 голос
/ 18 апреля 2010

По определению, вы не можете делать такую ​​арифметику с типом enum. Если вам это нужно, напишите свой собственный оператор + =, например:

bolumler& operator+=(bolumler& v1, int v2) {
    return v1 = bolumler(int(v1) + v2);
}
1 голос
/ 18 апреля 2010

Вы не можете использовать += для переменных типа enum, если не определите operator+=.

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

bolum = (bolumler)(bolum + 2); /* bolum=motor */

О вашем другом вопросе:

111.obj - 1 ошибка (и), 0 предупреждение (я) Можете ли вы мне помочь? Другой вопрос, что я могу сделать, если я хочу видеть вывод, как этот "muhasebe"?

Вам потребуется вручную преобразовать переменную enum в строку с помощью оператора switch.

std::string enum_to_string(bolumler val)
{
    swtich(val)
    {
       case programcilik:
         return "programcilik";
      //....
0 голосов
/ 18 апреля 2010

Реальная проблема в том, что то, что вы пытаетесь достичь, не имеет смысла в контексте перечисления.

Вы можете заменить любое значение вместо 2, но что произойдет, если возвращаемое вами значение не соответствует никакому значению перечисления? Это не определено ...

Я сталкивался с проблемой пару раз, в частности, кажется вполне разумным перебирать значения перечисления ... Единственное решение, которое я нашел, было спрятать значения в контейнер (например, vector ), а затем переберите контейнер.

0 голосов
/ 18 апреля 2010

Проблема в том, что перечисления могут неявно преобразовываться в int, но int не может неявно преобразовываться в типы перечислений.

Когда вы добавляете 2 в перечисление, результатом будет int или unsigned int (или, возможно, какой-то другой целочисленный тип, если перечисление содержит действительно большие значения), который не может быть назначен обратно перечисление без приведения. Чтобы сохранить это ограничение, в перечислениях также нет оператора +=.

Вы можете объявить bolum как int, а не как тип enum, или вы можете написать что-то вроде:

bolum = static_cast<bolumler>(bolum+2);

Но будьте осторожны, это немного рискованно. bolum+2 все еще находится в допустимом диапазоне перечислимого типа bolumler, и на самом деле так же buro+2 по техническим причинам, чтобы точно определить диапазон перечисления. Но в целом вы не можете просто добавить 2 к значению перечисления и ожидать, что оно обязательно будет в диапазоне перечисления. Единственная цель использования перечислимого типа вместо int состоит в том, чтобы получить дополнительную безопасность типов: если вы этого не хотите, просто определите набор целочисленных констант для нужных вам значений.

0 голосов
/ 18 апреля 2010

Перечисление не относится к типу int, хотя значения заменяются числовыми значениями. Таким образом, вы не можете использовать операторы на нем. Используйте целые числа вместо перечисления, чтобы заставить его работать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...