tyty5949
tyty5949

Reputation: 1530

Qt C++ cannot call member function ' ' without object

I keep getting this error:

cannot call member function 'QString Load::loadRoundsPlayed()'without object

Now im pretty new to c++ and qt so im not sure what this means. I am trying to call a function from another class to set the number on some lcdNumbers. Here is the Load.cpp which holds the function:

#include "load.h"
#include <QtCore>
#include <QFile>
#include <QDebug>

Load::Load() //here and down
{}

QString Load::loadRoundsPlayed()
{
    QFile roundsFile(":/StartupFiles/average_rounds.dat");

    if(!roundsFile.open(QFile::ReadOnly | QFile::Text))
    {
        qDebug("Could not open average_rounds for reading");
    }

    Load::roundsPlayed = roundsFile.readAll();
    roundsFile.close();
    return Load::roundsPlayed;
}

And here is the Load.h:

    #ifndef LOAD_H
     #define LOAD_H

    #include <QtCore>

    class Load
    {
    private:
        QString roundsPlayed; //and here
    public:
        Load();
        QString loadRoundsPlayed(); //and here
    };

    #endif // LOAD_H

And finally the place where i call the function:

    #include "mainwindow.h"
     #include "ui_mainwindow.h"
    #include "load.h"
    #include <QLCDNumber>

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        MainWindow::startupLoad();
    }

    MainWindow::~MainWindow()
    {
        delete ui;
    }
    void MainWindow::startupLoad()
    {
        ui->roundPlayer_lcdNumber->display(Load::loadRoundsPlayed()); //right here
    }

When i run this i get that error. Im not sure what it means so if anyone could help i would be thankfull. Thanks.

Upvotes: 1

Views: 23061

Answers (3)

Code-Apprentice
Code-Apprentice

Reputation: 83517

In Load::loadRoundsPlayed(), you should change

Load::roundsPlayed = roundsFile.readAll();

to

this->roundsPlayed = roundsFile.readAll();  

or simply

roundsPlayed = roundsFile.readAll();

This particular example won't fix the compiler error, but it illustrates where you are having some confusion with the syntax. When you prefix a function or variable name with "Load::", you are saying that you want the field that belongs to this class. However, every object of a class will have its own copy of the variables that you have declared in it. This means that you need to create an object before you can use them. Similarly, functions are bound to objects, so you again need an object in order to call a member function.

The other option is to make your functions static so that you don't need an object to call it. I strongly encourage you to learn about the difference between instance functions and static functions of a class so that you can use these two tools appropriately when the situation calls for it.

Upvotes: 0

Kiril Kirov
Kiril Kirov

Reputation: 38143

The error description is pretty clear

cannot call member function 'QString Load::loadRoundsPlayed()'without object

You cannot call member functions, that are not static, without creating instance of the class.


Looking at you code, you probably need to do this:

Load load;
ui->roundPlayer_lcdNumber->display(load.loadRoundsPlayed()); //right here

There are two other options:

  • make loadRoundsPlayed static and roundsPlayed static, if you don't want them to be associated with the concrete instances OR
  • make loadRoundsPlayed static and return QString by copy, that will be locally created inside the function. Something like

:

QString Load::loadRoundsPlayed()
{
    QFile roundsFile(":/StartupFiles/average_rounds.dat");

    if(!roundsFile.open(QFile::ReadOnly | QFile::Text))
    {
        qDebug("Could not open average_rounds for reading");
    }

    QString lRoundsPlayed = roundsFile.readAll();
    roundsFile.close();
    return lRoundsPlayed;
}

Upvotes: 9

Luchian Grigore
Luchian Grigore

Reputation: 258548

Because the method and member are not associated with class instances, make it static:

class Load
{
private:
    static QString roundsPlayed;
public:
    Load();
    static QString loadRoundsPlayed();
};

If you want them to be associated with instances, you'll need to create an object and call the method on it (it doesn't have to be static in this case).

Upvotes: 1

Related Questions