2013-11-14 2 views
3

У меня есть класс QObject Message и еще один по имени Request, который наследует класс сообщения. Вот заголовок файла:Как использовать перечисление в Qt?

#ifndef MESSAGE_H 
#define MESSAGE_H 

#include <QObject> 

class Message : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Message(QObject *parent = 0); 
    QString Source; 
    QString Destination; 
    QString Transaction; 
    QList<QObject> Content; 
signals: 

public slots: 

}; 

class Request : public Message 
{ 
    Q_OBJECT 
    Q_ENUMS(RequestTypes) 
public: 
    explicit Request(); 
    enum RequestTypes 
     { 
     SetData, 
     GetData 
     }; 

    RequestTypes Type; 
    QString Id; 
}; 

#endif // MESSAGE_H 

Теперь я хочу, чтобы создать запрос в мой код и установите в качестве типа SetData. Как я могу это сделать? Вот мой текущий код, который дает ошибку «Request :: RequestTypes» не является классом или пространством имен ». Файл заголовка сверху входит в мой файл заголовка основных программ, так Request известно и может быть создан, и я могу установить другие свойства - но не Type:

Request *r = new Request(); 
r->Source = "My Source"; 
r->Destination = "My Destination"; 
r->Type = Request::RequestTypes::SetData; 

Другими словами: я мог бы, как хорошо взял QString для свойства TypeRequest, но было бы неплохо и безопаснее сделать это с перечислением. Может кто-нибудь, пожалуйста, покажите мне, что здесь не так?

+0

Это должно работать нормально. Можете ли вы включить полное и неотредактированное сообщение об ошибке, а также полную программу (.e. A [SSCCe] (http://sscce.org/)), которая вызывает ошибку? –

+0

Нет ничего больше, вот полное сообщение об ошибке (при использовании кода из моего вопроса): mainwindow.cpp: 235: 24: error: 'Request :: RequestTypes' не является классом или пространством имен make: *** [mainwindow .o] Ошибка 1 – Robert

+0

Это странно, 'Request :: RequestTypes :: SetData' должен работать нормально. Возможно, это как-то связано с предварительной обработкой Qt, которая нарушает это в противном случае хорошее использование C++. –

ответ

7

Вы должны объявить перечисление следующим образом:

enum class RequestTypes 
    { 
    SetData, 
    GetData 
    }; 

для того, чтобы использовать его, как вы делали, но это требует C++ 11.

Нормальное использование было бы (в вашем случае): r->Type = RequestTypes::SetData;

+0

Вот оно, спасибо! – Robert

Смежные вопросы