我一直收到这个错误:
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
}
当我运行这个时,我得到了那个错误。我不知道这意味着什么如果有人能帮助我会感激不尽。感谢。
答案 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
,以便你不需要一个对象来调用它。我强烈建议您了解实例函数与类的静态函数之间的区别,以便在情境需要时可以适当地使用这两个工具。