c++ - Qt C++ 初始化类和从类调用带有变量的方法

标签 c++ qt

基本上我有一个具有多个 QString 值的类、一个构造函数和一个方法。该对象在构造函数中设置了它的“值”。然后我需要使用对象调用方法 toString() 以返回分配的值。当我尝试 invalid use of non-static data member 'DisconnectReason::BANNED' 时,我该怎么做。非常感谢任何帮助!

类:

class DisconnectReason
{
public:
    QString BANNED = "B&";
    QString IDLE_TIMEOUT = "it";
    QString KICKED = "k";
    QString MANUAL = "man";
    QString PING_TIMEOUT = "pt";
    QString reason;
    DisconnectReason(const QString reason)
    {
        this->reason = reason;
    }
public:
    virtual QString toString()
    {
        return reason;
    }
};

接口(interface).cpp

#include "interface.h"
#include "ui_interface.h"
#include <QDebug>
#include "constants.h"

Interface::Interface(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Interface)
{
    ui->setupUi(this);
    DisconnectReason *dr = new DisconnectReason(DisconnectReason::BANNED);//Error here
    qDebug() << dr->toString();
}

Interface::~Interface()
{
    delete ui;
}

最佳答案

由于 BANNED 变量(和其他变量)被声明为非静态成员,您不能像 DisconnectReason::BANNED 那样使用它。只有static members可以这样使用。

有两种选择:

  • 将这些变量声明为静态成员

  • 使用整数 enum 并在 toString 方法中为它们分配字符串。


声明静态

class DisconnectReason
{
public:
    static const QString BANNED;
    /* others */

    DisconnectReason(const QString &reason)
    {
        this->reason = reason;
    }

    virtual QString toString()
    {
        return reason;
    }
};

// .cpp
const QString DisconnectReason::BANNED = "B&";
/* others */

如上所示,您无法在类中初始化这些变量。您应该改为在您的类之外(在 .cpp 文件中)初始化它们,就像我所做的那样。 (只有constexpr表达式可以用作静态成员的类内初始化)

这样,使用 DisconnectReason::BANNED 是完全有效的。

使用枚举

class DisconnectReason
{
public:
    enum Reasons {
        BANNED,
        /* others */
    };

    DisconnectReason(const Reasons reason)
    {
        this->reason = reason;
    }

    virtual QString toString()
    {
        if(this->reason == BANNED){
            return "B&";
        }
        return "Unknown Reason";
    }
};

关于c++ - Qt C++ 初始化类和从类调用带有变量的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42217827/

相关文章:

c++ - 如何检测多柱形态?

c++ - 为什么 "unreferenced formal parameter"让我担心?

c++ - 模板类之间模板类型的转换还要专门化

c++ - tizen 中的 unix 日期转换

c++ - 如何更改 QDockWidget float 按钮的颜色

c++ - 将信号从 QML 连接到 Qt : var to QList<QString>

c++ - 了解 SFINAE

qt - 如何在QML的.qrc资源文件中指定通配符?

c++ - QThread内存泄漏

c++ - Qt 获取当前应用程序的运行时间