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 に答える