Передача перечислений в функции в C ++ - PullRequest
0 голосов
/ 13 апреля 2010

У меня есть заголовочный файл со всеми перечисленными перечислениями (используется конструкция #ifndef #define #endif, чтобы избежать многократного включения файла), который я использую в нескольких файлах cpp в моем приложении. Один из перечислений в файлах это

enum StatusSubsystem {ENABLED,INCORRECT_FRAME,INVALID_DATA,DISABLED};

В приложении есть функции, помеченные как

ShowStatus(const StatusSubsystem&);

Ранее в приложении, когда я делал вызовы вышеупомянутой функции, как

ShowStatus(INCORRECT_FRAME);

мое приложение отлично компилировалось. Но после добавления некоторого кода компиляция останавливается, выдавая следующую ошибку:

File.cpp:71: error: invalid conversion from `int' to `StatusSubsystem'
File.cpp:71: error:   initializing argument 1 of `void Class::ShowStatus(const StatusSubsystem&)

Я проверил код на наличие противоречивых перечислений в новом коде, и он выглядел нормально.

Мой вопрос: что не так с вызовом функции, который компилятор показывает как ошибочный?

Для справки, определение функции:

void Class::ShowStatus(const StatusSubsystem& eStatus)
{

   QPalette palette;
   mStatus=eStatus;//store current Communication status of system 
   if(eStatus==DISABLED)
   {
     //select red color for  label, if it is to be shown disabled
     palette.setColor(QPalette::Window,QColor(Qt::red));
     mLabel->setText("SYSTEM");

   }
   else if(eStatus==ENABLED)
   {
      //select green color for label,if it is to be shown enabled
      palette.setColor(QPalette::Window,QColor(Qt::green));
     mLabel->setText("SYSTEM");

   }
   else if(eStatus==INCORRECT_FRAME)
   {
      //select yellow color for  label,to show that it is sending incorrect frames
      palette.setColor(QPalette::Window,QColor(Qt::yellow));
      mLabel->setText("SYSTEM(I)");

   }
   //Set the color on the  Label
   mLabel->setPalette(palette);
}

Странным побочным эффектом этой ситуации является то, что она компилируется, когда я приводил все вызовы ShowStatus () как

ShowStatus((StatusSubsystem)INCORRECT_FRAME);

Хотя это устраняет любую ошибку компиляции, но происходит странная вещь. Хотя я делаю вызов INCORRECT_FRAME выше, но в определении функции он совпадает с ENABLED. Как на земле это возможно? Это как при передаче INCORRECT_FRAME по ссылке, он волшебным образом преобразуется в ENABLED, что должно быть невозможно. Это сводит меня с ума.

Можете ли вы найти какой-либо недостаток в том, что я делаю? или это что-то еще?

Приложение выполнено с использованием C ++, Qt-4.2.1 на RHEL4.

Спасибо.

1 Ответ

6 голосов
/ 13 апреля 2010

Вы должны принимать перечисление по значению, а не по константной ссылке. Он достаточно мал, чтобы поместиться в int, так что нет потери производительности или чего-то подобного.

Но из того, что вы описываете, похоже, что у кого-то есть #define d INCORRECT_FRAME до 0 в другом месте. Вы должны поместить что-то вроде следующего в строке выше:

#ifdef INCORRECT_FRAME
#error Whoops, INCORRECT_FRAME already defined!
#endif

Кстати, вещь #ifndef (для ваших заголовочных файлов) называется include guard . : -)

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