我的班级遇到了一些问题,因为他们两个都相互依赖,如果没有宣布另一个人就不能宣布。
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;
};
正如您所看到的,“块”类需要知道“板”是什么,反之亦然。提前谢谢!
答案 0 :(得分:10)
在“阻止”之前定义“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...
答案 1 :(得分:6)
使用以下行在block
前转发声明board
课程:
class block;
在两个类的声明之后放置函数体的代码。向前声明您的类并不能使其所有函数可用,它只是允许编译器知道这样的类存在。它只允许使用指向这样一个类的指针(因为指针类型的大小不依赖于类的布局)。
答案 2 :(得分: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;
};
答案 3 :(得分:-4)
这通常是一个设计问题。我建议你选择较小的类(在你的情况下我建议使用块类)并在其上编写一些董事会会签署的事件。然后,不是调用board类方法,而是拍摄事件并让board类自己调用它。