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

他に 2 つのオプションがあります。

  • それらを具体的なインスタンスに関連付けたくない場合は、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::」を付けると、このクラスに属するフィールドが必要であるということになります。ただし、クラスのすべてのオブジェクトには、宣言した変数の独自のコピーがあります。これは、オブジェクトを使用する前にオブジェクトを作成する必要があることを意味します。同様に、関数はオブジェクトにバインドされるため、メンバー関数を呼び出すにはオブジェクトが必要です。

もう 1 つのオプションは、関数staticを呼び出してオブジェクトを必要としないようにすることです。クラスのインスタンス関数と静的関数の違いについて学習し、状況に応じてこれら 2 つのツールを適切に使用できるようにすることを強くお勧めします。

于 2012-07-31T18:43:08.917 に答える