我正在实施纸牌游戏。我希望窗口ui
成为类Rule
的对象,以便Rule
可以直接修改GUI。
因此Rule
在构造函数中初始化了一个对象Window * ui
。
但是在编译期间,编译器告诉我在rule.h
中,“Window尚未声明”,“Window不是类型”。我包括<window.h>
,所有内容都有相同的类型,所有内容都已初始化,所以我没有想到它为什么不起作用。
编辑:我在alexisdm的笔记之后编辑了代码。此外,在rule.h
中,我必须将ui
的定义从Window * ui
更改为Ui::Window *ui
,因为在window.h
中,ui
已定义作为Ui::Window * ui
,这是我想要Rule::rule
控制的对象。
但是现在,在rule.cpp中,ui->do_stuff()
无法编译,因为Ui::Window
没有do_stuff()
函数,但Window
会... {/ p >
精氨酸!该怎么办?!! ui-> do_stuff()在window.cpp中工作正常。继承问题?
window.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;
};
rule.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
rule.cpp
#include <rule.h>
Rule::Rule(Game_state * game, Ui::Window * window){
player = game;
ui = window;
}
void Rule::stuff(){
ui->do_stuff();
}
答案 0 :(得分:1)
标头中存在循环依赖关系:window.h
和rule.h
互相引用。
您应该用前向声明替换#include
以避免它。
class Window; // instead of #include "window.h"
class Rule; // instead of #include "rule.h"
您仍需要在#include "window.h"
中添加rule.cpp
,在#include "rule.h"
中添加window.cpp
。
答案 1 :(得分:0)
我的猜测是您的班级名称Window
,过于通用,#include <window.h>
可能包含系统而不是您的。
尝试将clase和标题名称更改为更适合您应用的内容,例如CardWindow
,或使用#include "window.h"