Qt C ++无法在没有对象的情况下调用成员函数

时间:2012-07-31 18:33:56

标签: c++ qt function user-interface

我一直收到这个错误:

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

现在我对c ++和qt很新,所以我不确定这意味着什么。我试图从另一个类调用一个函数来设置一些lcdNumbers上的数字。这是Load.cpp,它包含函数:

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

这是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

最后我称之为功能的地方:

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

当我运行这个时,我得到了那个错误。我不知道这意味着什么如果有人能帮助我会感激不尽。感谢。

3 个答案:

答案 0 :(得分:8)

错误描述非常清楚

无法调用成员函数'QString Load :: loadRoundsPlayed()'无对象

如果不创建类的实例,则无法调用非静态的成员函数。


查看代码,您可能需要这样做:

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

还有两个选择:

    如果您不希望它们与具体实例相关联,则
  • 使loadRoundsPlayed静态和roundsPlayed静态或
  • 使loadRoundsPlayed静态并按副本返回QString,这将在函数内部本地创建。像
  • 这样的东西

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

答案 1 :(得分:1)

因为方法和成员与类实例没有关联,所以将它设为静态:

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

如果您希望它们与实例相关联,您需要创建一个对象并在其上调用该方法(在这种情况下,它不必是static。)

答案 2 :(得分:0)

Load::loadRoundsPlayed()中,您应该更改

Load::roundsPlayed = roundsFile.readAll();

this->roundsPlayed = roundsFile.readAll();  

或只是

roundsPlayed = roundsFile.readAll();

这个特殊的例子不会修复编译器错误,但它说明了你对语法有些混淆的地方。当您使用&#34; Load ::&#34;为函数或变量名添加前缀时,您说您想要属于此类的字段。但是,类的每个对象都有自己在其中声明的变量的副本。这意味着您需要先创建一个对象,然后才能使用它们。类似地,函数绑定到对象,因此您再次需要一个对象来调用成员函数。

另一个选项是让你的功能static,以便你不需要一个对象来调用它。我强烈建议您了解实例函数与类的静态函数之间的区别,以便在情境需要时可以适当地使用这两个工具。