我的班级遇到了一些问题,因为他们都互相依赖,如果没有宣布另一个人就不能宣布。

class block: GtkEventBox {

    public:
        block(board board,guint x,guint y): image("block.png") {
            this.board = board;
            this.x = x;
            this.y = y;
            board.attach(this,x,y,x+1,y+1);
        }
        void move(guint x,guint y) {
            board.remove(this);
            this.x = x;
            this.y = y;
            board.attach(this,x,y,x+1,y+1);
        }

    private:
        guint x, y;
        board board;
        GtkImage image;

};

class board: Gtk::Table {

    public:
        board(): Gtk::Table(25,20) {
            blocks_c = 0;
        }
        void addBlock(guint x,guint y) {
            blocks_a[blocks_c++] = new block(this,x,y);
        }

    private:
        block* blocks_a[24];
        int blocks_c;

};

正如你可以看到“阻止”一样。班级需要知道什么是“董事会”反之亦然。提前谢谢!

有帮助吗?

解决方案

定义“董事会”在“阻止”之前并且转发声明“块”类。另外,将板函数的实现移出类定义。

// forward declare block class
class block;

// declare board class
class board: Gtk::Table {

    public:
        board();
        void addBlock(guint x,guint y);

    private:
        block* blocks_a[24];
        int blocks_c;

};

// declare block class
class block: GtkEventBox {

    public:
        block(board board,guint x,guint y);
        void move(guint x,guint y);

    private:
        guint x, y;
        board board;
        GtkImage image;

};

// define member functions (implementation) here...

其他提示

  1. 使用以下行在 board 之前转发声明 block 类:

    class block;

  2. 在两个类的声明之后放置函数体的代码。向前声明您的类并不能使其所有函数可用,它只允许编译器知道这样的类存在。它只允许使用指向这样一个类的指针(因为指针类型的大小不依赖于类的布局)。

通过前瞻声明可以很容易地解决这个问题。由于 board 不需要了解 block 类的任何内容,只有它使用指向它的指针,首先声明它。但在此之前包括 block 的前向声明。它看起来像这样:

class block; // <- Forward declaration!

class board: Gtk::Table {

    public:
        board(): Gtk::Table(25,20) {
            blocks_c = 0;
        }
        void addBlock(guint x,guint y) {
            blocks_a[blocks_c++] = new block(this,x,y);
        }

    private:
        block* blocks_a[24];
        int blocks_c;

};    class block: GtkEventBox {

    public:
        block(board board,guint x,guint y): image("block.png") {
            this.board = board;
            this.x = x;
            this.y = y;
            board.attach(this,x,y,x+1,y+1);
        }
        void move(guint x,guint y) {
            board.remove(this);
            this.x = x;
            this.y = y;
            board.attach(this,x,y,x+1,y+1);
        }

    private:
        guint x, y;
        board board;
        GtkImage image;

};

这通常是一个设计问题。我建议你选择较小的类(在你的情况下我建议使用块类)并在其上编写一些董事会会签署的事件。然后,不是调用board类方法,而是拍摄事件并让board类自己调用它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top