Nicholas Johnson
Nicholas Johnson

Reputation: 1022

Qt C++ Initializing Class and Calling method w/ Variable from Class

Basically I have a class that has multiple QString values, a constructor, and a method. The object gets it's 'values' set in the constructor. Then I need to call the method, toString() using the object to return the assigned value. How can I do this as when I try I get invalid use of non-static data member 'DisconnectReason::BANNED'. Any help is greatly appreciated!

Class:

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;
}

Upvotes: 0

Views: 1164

Answers (1)

frogatto
frogatto

Reputation: 29285

Since BANNED variable (and others) is declared as a non-static member, you can't use it like DisconnectReason::BANNED. Only static members can be used like that.

There's two options:

  • Declaring those variables as static members

  • Using integral enum and assign them their strings in toString method.


Declaring static

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 */

As it's shown above, you can't initialize those variables in-class. You should instead initialize them out-side of your class (in a .cpp file), like what I've done. (Only constexpr expressions can be used as in-class initialization of static members)

This way, using DisconnectReason::BANNED is perfectly valid.

Using enum

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";
    }
};

Upvotes: 2

Related Questions