【问题标题】:Comparing value of enum gives compiler error比较枚举的值会导致编译器错误
【发布时间】:2019-08-27 06:15:29
【问题描述】:

我已将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 的值?我在Ubuntu 18.04.3 LTS 64bit 上使用Qt Creator 4.9.2

【问题讨论】:

  • 看起来messageStatus 是类型名称,而不是变量。

标签: c++ enums


【解决方案1】:

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

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

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

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

链接的答案稍微误导了您,因为他们也没有这样做。但他们也不会尝试以这种方式使用它。查看链接的问题,而不是关于您需要做什么。

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 2018-12-12
    • 2014-10-21
    • 1970-01-01
    • 2016-02-07
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多