0

カードゲームを実装しています。ウィンドウuiを class のオブジェクトにして、GUI を直接変更できるようにします RuleRule

したがって、コンストラクターで初期化されRuleたオブジェクトがあります。Window * ui

しかし、コンパイル中に、コンパイラはrule.h、「ウィンドウは宣言されていません」、「ウィンドウは型ではありません」と通知します。すべてが同じタイプで<window.h>、すべてが初期化されているため、機能しない理由のアイデアが不足しています。

編集: alexisdm のメモに従ってコードを編集しました。さらに、 inでは の定義をからにrule.h変更する必要がありました。 inではが として定義されており、これが制御したいオブジェクトだからです。uiWindow * uiUi::Window *uiwindow.huiUi::Window * uiRule::rule

しかし今、rule.cpp では、関数を持っていないui->do_stuff()ため、コンパイルされませんが、 ...Ui::Windowdo_stuff()Window

アーグ!何をすべきか?!!ui->do_stuff() は window.cpp で正常に動作します。継承の問題?

ウィンドウ.cpp:

    Window::Window(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Window)
{
    ui->setupUi(this);

    player = new Game_state();                  /* Game state                   */
    rule = new Rule(player, ui);                /* Implement the action of cards*/
}
void Window::do_stuff(){
//Do stuff
}

window.h

#include <QDialog>
#include "game_state.h"
#include "rule.h"

class Rule;
namespace Ui {
    class Window;
}

class Window : public QDialog
{
    Q_OBJECT

public:
    explicit Window(QWidget *parent = 0);
    ~Window();
    Game_state      * player;
    Rule            * rule;
    void do_stuff();

private:
    Ui::Window *ui;
};

ルール.h

#ifndef RULE_H
#define RULE_H
#include "window.h"
#include <game_state.h>

class Window;

class Rule{
public:
    Rule(Game_state *, Ui::Window *);
    void action(Card *);

private:
    Game_state * player;
    Ui::Window     * ui;
};


#endif // RULE_H

ルール.cpp

    #include <rule.h>

    Rule::Rule(Game_state * game, Ui::Window * window){
        player = game;
        ui = window;
    }
    void Rule::stuff(){
        ui->do_stuff();
    }
4

2 に答える 2

1

ヘッダーに循環依存関係がありますwindow.hrule.h相互に参照しています。

#includeそれを避けるために、両方を前方宣言に置き換える必要があります。

class Window;  // instead of #include "window.h"
class Rule;  // instead of #include "rule.h"

#include "window.h"inrule.cpp#include "rule.h"inを追加する必要がありますwindow.cpp

于 2012-11-09T19:38:55.943 に答える
0

私の推測では、あなたのクラスの名前はWindow一般的すぎて、#include <window.h>おそらくあなたの代わりにシステムの名前が含まれています。

クラスとヘッダー名を のようなアプリ固有の名前に変更してみてくださいCardWindow。または、#include "window.h"

于 2012-11-09T18:24:27.770 に答える