代码之家  ›  专栏  ›  技术社区  ›  KernelPanic

比较enum的值会导致编译器错误

  •  0
  • KernelPanic  · 技术社区  · 5 年前

    我暴露了 C++ enum Qt 5.7 QML ,就像书中描述的那样 this question 下面是类声明/实现:

    #ifndef SPLASHSCREENLOGVIEWERMESSAGESTATUS_H
    #define SPLASHSCREENLOGVIEWERMESSAGESTATUS_H
    
    #include <QObject>
    #include <QQmlEngine>
    
    /**
     * @class Enum class for splash screen log viewer message status
     */
    class SplashScreenLogViewerMessageStatus : public QObject
    {
        Q_OBJECT
    
    public:
        /**
         *! Splash screen log viewer message status enum
         */
        enum messageStatus
        {
            STATUS_MESSAGE_LOADING=0x01,               /*!< Message loading state */
            STATUS_MESSAGE_LOAD_OK=0x02,               /*!< Message load OK state */
            STATUS_MESSAGE_LOAD_FAILED=0x03            /*!< Message load FAILED state */
        };
    
        Q_ENUM(messageStatus)
    
    public:
        /**
         * @brief Constructor
         */
        inline explicit SplashScreenLogViewerMessageStatus()
            : QObject()
        {
        }   // constructor
    
        /**
         * @brief QML type registration method
         */
        inline static void registerQMLType()
        {
            qmlRegisterType<SplashScreenLogViewerMessageStatus>("com.example",
                                                                1,
                                                                0,
                                                                "SplashScreenLogViewerMessageType");
        }   // registerQMLType
    };  // SplashScreenLogViewerMessageStatus (class)
    
    #endif // SPLASHSCREENLOGVIEWERMESSAGESTATUS_H
    

    我在下面的课堂上使用它:

    #ifndef SPLASHSCREENLOGVIEWERMODELRECORD_H
    #define SPLASHSCREENLOGVIEWERMODELRECORD_H
    
    #include <QString>
    
    #include "splashscreenlogviewermessagestatus.h"
    
    /**
     * @class Splash screen log viewer model record
     */
    class SplashScreenLogViewerModelRecord
    {
    private:
        /**
         * @brief Message text
         */
        QString messageText;
    
        /**
         * @brief Message status object
         */
        SplashScreenLogViewerMessageStatus messageStatusObj;
    
    public:
        /**
         * @brief Constructor
         */
        SplashScreenLogViewerModelRecord();
    
        /**
         * @brief Constructor
         */
        SplashScreenLogViewerModelRecord(const QString& messageText,
                                         const SplashScreenLogViewerMessageStatus& messageStatusObj);
    
        /**
         * @brief Message text getter
         * @return message text
         */
        QString getMessageText() const;
    
        /**
         * @brief Message text setter
         * @param text
         */
        void setMessageText(const QString& text);
    
        /**
         * @brief Message status getter
         * @return message status
         */
        QString getMessageStatus() const;
    
        /**
         * @brief Message status setter
         * @param status
         */
        void setMessageStatus(const SplashScreenLogViewerMessageStatus& status);
    };
    
    #endif // SPLASHSCREENLOGVIEWERMODELRECORD_H
    

    和实施:

    #include "splashscreenlogviewermodelrecord.h"
    
    SplashScreenLogViewerModelRecord::SplashScreenLogViewerModelRecord()
    {
        SplashScreenLogViewerMessageStatus messageStatus;
    
        this->setMessageText(QString(""));
        this->setMessageStatus(messageStatus);
    }   // constructor
    
    QString SplashScreenLogViewerModelRecord::getMessageText() const
    {
        return this->messageText;
    }   // getMessageText
    
    void SplashScreenLogViewerModelRecord::setMessageText(const QString& text)
    {
        this->messageText=text;
    }   // setMessageText
    
    QString SplashScreenLogViewerModelRecord::getMessageStatus() const
    {
        if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
        {
            return QString("Loading ...");
        }
    //    else if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOAD_OK)
    //    {
    //        return QString("Load OK.");
    //    }
    //    else if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOAD_FAILED)
    //    {
    //        return QString("Load FAILED.");
    //    }
        else
        {
            return QString("");
        };
    }   // getMessageStatus
    
    void SplashScreenLogViewerModelRecord::setMessageStatus(const SplashScreenLogViewerMessageStatus &status)
    {
    //    this->messageStatus.SplashScreenLogViewerMessageStatusEnum=status.SplashScreenLogViewerMessageStatusEnum;
    //    this->messageStatus.messageStatus=status;
    }   // setMessageStatus
    

    如果我试图用这些文件构建项目,我会遇到以下错误:

    models/splashscreenlogviewermodelrecord.cpp: In member function ‘QString SplashScreenLogViewerModelRecord::getMessageStatus() const’: models/splashscreenlogviewermodelrecord.cpp:23:31: error: invalid use of ‘enum SplashScreenLogViewerMessageStatus::messageStatus’
         if(this->messageStatusObj.messageStatus ==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
                                   ^~~~~~~~~~~~~ models/splashscreenlogviewermodelrecord.cpp:23:81: error: expected primary-expression before ‘.’ token
         if(this->messageStatusObj.messageStatus ==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
    

    错误存在于方法中 QString SplashScreenLogViewerModelRecord::getMessageStatus() const ,特别是在第一行:

    if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
    

    我该如何比较 enum 价值我在用 Qt Creator 4.9.2 在…上 Ubuntu 18.04.3 LTS 64bit .

    1 回复  |  直到 5 年前
        1
  •  3
  •   Sebastian Redl    5 年前

    摆脱所有的Qt混淆,剩下的大致是:

    class Foo {
    public:
      enum fooValues { one, two };
    };
    
    void user(const Foo& foo) {
      if (foo.fooValues == Foo::one) {
        // doesn't compile
      }
    }
    

    问题是 Foo::fooValues 是一个 嵌套类型 ,而不是 成员变量 .您从未声明过该类型的成员变量。

    你已经被链接的答案稍微误导了,因为他们也没有这样做。但他们也不想这样使用它。看看相关的问题,而不是你需要做什么。