1

我的班级有一些问题,因为它们都相互依赖,如果没有声明另一个,就不能声明一个。

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;

};

如您所见,“块”类需要知道“板”是什么,反之亦然。提前致谢!

4

4 回答 4

10

在“block”之前定义“board”并向前声明“block”类。此外,将板函数的实现移出类定义。

// 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...
于 2009-09-12T15:41:36.407 回答
6
  1. 在此行之前前向声明您的block课程:board

    类块;

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

于 2009-09-12T15:41:10.777 回答
0

这可以通过前向声明轻松解决。由于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;

};
于 2009-09-12T15:39:02.840 回答
-4

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

于 2009-09-12T15:38:32.810 回答