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

时间:2019-08-27 06:15:29

标签: c++ enums

我已经将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 个答案:

答案 0 :(得分:3)

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

class Foo {
public:
  enum fooValues { one, two };
};

void user(const Foo& foo) {
  if (foo.fooValues == Foo::one) {
    // doesn't compile
  }
}

这里的问题是Foo::fooValues嵌套类型,而不是成员变量。您永远不会声明该类型的成员变量。

您对链接的答案有些误解,因为他们也不这样做。但是他们也不会尝试以这种方式使用它。请查看链接的问题,而不是您需要做什么。