3

私には2つのクラスがGameあり、属性を使用しApButtonたいので、これら2つのフレンド関数を作成したいのですが、エラーが発生し続けます:ApButtonGame

`Game` does not name a type 

apbutton.hゲームクラスに追加すべきではないことはわかっていますが、ゲームが使用するためApButton(プッシュボタンから継承されたクラス)、追加する必要があります。この問題に対する他の解決策はありますか?

2 つのクラスのコードは次のとおりです。

#ifndef GAME_H
#define GAME_H

#include <QtGui>
#include <QWidget>
#include <apbutton.h>  //I have to add this
#include <QHBoxLayout>
#include <QTimer>
#include <iostream>
#include <QMouseEvent>

using namespace std;

namespace Ui {
    class Game;
}

friend class ApButton;

class Game : public QWidget
{
    Q_OBJECT
public:
    explicit Game(QWidget *parent = 0);
    ~Game();
    QLabel *bomb_label();
private:
    Ui::Game *ui;
    ApButton **btn;   //that's why I have to include apbutton.h
};

#endif // GAME_H


#ifndef APBUTTON_H
#define APBUTTON_H

#include <QPushButton>
#include <iostream>
#include <QMouseEvent>
#include <game.h>

using namespace std;

class ApButton : public QPushButton
{
    Q_OBJECT
public:
    explicit ApButton(QWidget *parent = 0);
    void setRowCol(int _row,int _col);
    void mousePressEvent(QMouseEvent *ev);
private:
    string name;
    int row;
    int col;
    Game g;   //here is the problem!
};

#endif // APBUTTON_H
4

1 に答える 1

5

Ui::Gameは Qt で生成されたウィジェット クラスであり、Gameは実装クラスであると想定しています。あなたの問題は、(「Game.h」と「ApButton.h」の間の) 循環包含依存関係であり、通常は前方宣言を使用して解決されます。実際、 「Game.h」のUi::Gameクラスで既にそのメカニズムを使用しています。

namespace Ui {
    class Game;
}

その下に追加するだけです:

class ApButton;

そして削除します:

#include <apbutton.h>

"Game.h" ヘッダーでApButtonのメソッドを使用する予定がなく、 btnがポインター メンバーのままでない限り (なぜここでポインターが二重になっているのでしょうか?)、不完全な型で問題ありません。

友達宣言も

friend class ApButton;

Gameクラスに属します。

于 2013-07-27T21:28:25.400 に答える