1

我不断收到此错误:

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
    }

当我运行它时,我得到了那个错误。我不确定这意味着什么,所以如果有人可以帮助我,我将不胜感激。谢谢。

4

3 回答 3

9

错误描述很清楚

不能在没有对象的情况下调用成员函数'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;
}
于 2012-07-31T18:35:40.100 回答
1

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

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

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

于 2012-07-31T18:38:38.337 回答
0

Load::loadRoundsPlayed(),你应该改变

Load::roundsPlayed = roundsFile.readAll();

this->roundsPlayed = roundsFile.readAll();  

或者干脆

roundsPlayed = roundsFile.readAll();

这个特定示例不会修复编译器错误,但它说明了您在哪里对语法有一些混淆。当您在函数或变量名称前加上“Load::”时,您是在说您想要属于此类的字段。但是,类的每个对象都将拥有自己在其中声明的变量的副本。这意味着您需要先创建一个对象才能使用它们。同样,函数绑定到对象,因此您再次需要一个对象才能调用成员函数。

另一种选择是制作你的函数static,这样你就不需要一个对象来调用它。我强烈建议您了解类的实例函数和静态函数之间的区别,以便在需要时可以适当地使用这两个工具。

于 2012-07-31T18:43:08.917 回答