Frage

Ich habe einige Probleme mit meiner Klasse, weil sie beide aufeinander hängt zu einem nicht ohne das andere wird erklärt erklärt werden kann.

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;

};

Wie Sie die „Block“ Klasse wissen muss, um zu sehen, was ein „Board“ ist und umgekehrt. Vielen Dank im Voraus!

War es hilfreich?

Lösung

definieren „Board“ vor „Block“ und leiten die „Block“ Klasse deklariert. Auch bewegen, um die Umsetzung der Board-Funktionen aus der Klassendefinition.

// 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...

Andere Tipps

  1. Zukunfts erklären Ihre block Klasse vor board mit dieser Zeile:

    Klasse Block;

  2. Setzen Sie den Code der Funktionskörper NACH Erklärungen beiden Klassen. Vorwärts-Erklärung Ihrer Klasse nicht alle Funktionen verfügbar macht, erlaubt es nur der Compiler zu wissen, dass eine solche Klasse vorhanden ist. Es erlaubt nur zu verwenden, zum Beispiel Hinweise auf eine solche Klasse (weil die Größe der Zeigertyp hängt nicht von dem Layout der Klasse).

Dies kann leicht mit einer Vorwärtsdeklaration resoved werden. Da board braucht nichts viel über die block Klasse wissen, nur, dass es einen Zeiger darauf verwendet, deklarieren Sie es zuerst. aber vor, dass gehört eine Vorwärtsdeklaration für block. Es sieht wie folgt aus:

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;

};

Dies ist normalerweise ein Designproblem. Ich schlage vor, Sie die kleinere Klasse zu holen (in Ihrem Fall würde ich den Block Klasse vorschlagen) und Code einige Ereignisse darauf, dass das Board Klasse schreiben würde. Dann stattdessen das Board Klassenmethode aufzurufen, das Ereignis schießen und lassen Sie die Board-Klasse es selbst nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top