C ++ Qt - Ui :: Window和继承/转发声明

时间:2012-11-09 17:43:07

标签: qt

我正在实施纸牌游戏。我希望窗口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();
    }

2 个答案:

答案 0 :(得分:1)

标头中存在循环依赖关系:window.hrule.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"