基本上我有一个具有多个 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/