Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt C++;初始化类并从类调用方法w/变量_C++_Qt - Fatal编程技术网

C++ Qt C++;初始化类并从类调用方法w/变量

C++ Qt C++;初始化类并从类调用方法w/变量,c++,qt,C++,Qt,基本上,我有一个类,它有多个QString值、一个构造函数和一个方法。对象在构造函数中获取其“值”集。然后我需要调用方法,toString(),使用对象返回指定的值。当我尝试使用非静态数据成员'DisconnectReason::Banked'时,我如何做到这一点。非常感谢您的帮助 类别: class DisconnectReason { public: QString BANNED = "B&"; QString IDLE_TIMEOUT = "it"; QSt

基本上,我有一个类,它有多个QString值、一个构造函数和一个方法。对象在构造函数中获取其“值”集。然后我需要调用方法,
toString()
,使用对象返回指定的值。当我尝试使用非静态数据成员'DisconnectReason::Banked'时,我如何做到这一点。非常感谢您的帮助

类别:

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;
}
#包括“interface.h”
#包括“ui_interface.h”
#包括
#包括“constants.h”
接口::接口(QWidget*父项):
QMainWindow(父级),
ui(新的ui::接口)
{
用户界面->设置用户界面(此);
DisconnectReason*dr=新建DisconnectReason(DisconnectReason::Banked);//此处出错
qDebug()到字符串();
}
接口::~接口()
{
删除用户界面;
}

由于
禁用的
变量(和其他变量)被声明为非静态成员,因此不能像
断开连接原因::禁用的那样使用它。只能这样使用

有两种选择:

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

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


声明静态 如上所示,您不能在类中初始化这些变量。相反,您应该在类外初始化它们(在
.cpp
文件中),就像我所做的那样。(只有表达式才能用作静态成员的类内初始化)

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

使用
enum

由于
banked
变量(和其他变量)被声明为非静态成员,因此不能像
DisconnectReason::banked那样使用它。只能这样使用

有两种选择:

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

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


声明静态 如上所示,您不能在类中初始化这些变量。相反,您应该在类外初始化它们(在
.cpp
文件中),就像我所做的那样。(只有表达式才能用作静态成员的类内初始化)

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

使用
enum

这个错误似乎非常清楚——QString并没有声明为静态,但您试图像使用静态一样使用它。您需要实例化DisconnectReason类的一个实例并从中获取字符串,或者使该QString成为静态的。错误似乎非常清楚——QString没有声明为静态的,但您正在尝试使用它,就好像它是静态的一样。您需要实例化DisconnectReason类的一个实例并从中获取字符串,或者将该QString设置为静态。谢谢你,我到家后会试试的!这很有效。但是,我有一个
Constants.cpp
,它有一个类的构造函数:
Constants
。当我从中得到一个变量时,它表示
对'DisconnectReason::banked'的未定义引用
@NicholasJohnson
静态
成员应该在
.cpp
文件中定义。请参见和。因此,.h?中根本没有变量声明。@NicholasJohnson编辑了我的答案<代码>QString DisconnectReason::banked=“B&”
应该在
.cpp
中。这看起来很有希望。谢谢你,我到家后会试试的!这很有效。但是,我有一个
Constants.cpp
,它有一个类的构造函数:
Constants
。当我从中得到一个变量时,它表示
对'DisconnectReason::banked'的未定义引用
@NicholasJohnson
静态
成员应该在
.cpp
文件中定义。请参见和。因此,.h?中根本没有变量声明。@NicholasJohnson编辑了我的答案<代码>QString DisconnectReason::banked=“B&”应位于
.cpp
中。
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 */
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";
    }
};