2012-07-31 37 views
1

我不断收到此错误:Qt的C++不能调用成员函数“”没有对象

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

现在即时通讯相当新的C++和Qt所以我不会知道这意味着什么。我正在尝试从另一个类中调用一个函数来设置一些lcdNumber上的数字。这里是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 

最后的地方,我调用该函数:

​​

当我运行这个我得到那个错误。林不知道这意味着什么,如果任何人都可以帮助我会感谢。谢谢。

回答

7

错误说明是很清楚

不能调用成员函数“QString的负载:: 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

因为方法和成员不与类的实例相关联,使之静:

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

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

0

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

Load::roundsPlayed = roundsFile.readAll(); 

this->roundsPlayed = roundsFile.readAll(); 

或者干脆

roundsPlayed = roundsFile.readAll(); 

这个特殊的例子并不能修复编译器错误,但它说明你在哪里对语法有一些困惑。当你用“Load ::”作为函数或变量名的前缀时,你说你想要属于这个类的字段。但是,类的每个对象都将拥有自己的已声明变量的副本。这意味着你需要创建一个对象,然后才能使用它们。同样,函数绑定到对象,所以你需要一个对象来调用成员函数。

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

相关问题