カードゲームを実装しています。ウィンドウui
を class のオブジェクトにして、GUI を直接変更できるようにします Rule
。Rule
したがって、コンストラクターで初期化されRule
たオブジェクトがあります。Window * ui
しかし、コンパイル中に、コンパイラはrule.h
、「ウィンドウは宣言されていません」、「ウィンドウは型ではありません」と通知します。すべてが同じタイプで<window.h>
、すべてが初期化されているため、機能しない理由のアイデアが不足しています。
編集: alexisdm のメモに従ってコードを編集しました。さらに、 inでは の定義をからにrule.h
変更する必要がありました。 inではが として定義されており、これが制御したいオブジェクトだからです。ui
Window * ui
Ui::Window *ui
window.h
ui
Ui::Window * ui
Rule::rule
しかし今、rule.cpp では、関数を持っていないui->do_stuff()
ため、コンパイルされませんが、 ...Ui::Window
do_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();
}