C ++クラスの依存関係
-
06-07-2019 - |
質問
クラスは両方とも互いに依存しているため、クラスに問題があります。一方は宣言され、もう一方は宣言されていません。
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...
他のヒント
-
board
の前に、次の行でblock
クラスを前方宣言します:クラスブロック;
-
両方のクラスの宣言の後に関数本体のコードを配置します。クラスを前方宣言すると、そのすべての機能が使用可能になるわけではなく、コンパイラがそのようなクラスが存在することを知ることができます。たとえば、そのようなクラスへのポインターを使用することができます(ポインター型のサイズはクラスのレイアウトに依存しないため)。
これは、forward宣言で簡単に解決できます。 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;
};
これは通常、設計上の問題です。小さいクラスを選択し(あなたの場合、ブロッククラスを提案します)、ボードクラスが署名するイベントをいくつかコーディングすることをお勧めします。次に、ボードクラスメソッドを呼び出す代わりに、イベントを撮影し、ボードクラスがそれ自体を呼び出すようにします。
所属していません StackOverflow