Domanda

Sto avendo dei problemi con la mia classe perché entrambi dipendono l'uno dall'altro, uno non può essere dichiarato senza l'altro dichiarato.

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;

};

Come puoi vedere il " blocco " la classe ha bisogno di sapere cosa è una "scheda" è e viceversa. Grazie in anticipo!

È stato utile?

Soluzione

Definisci " scheda " prima di "bloccare" e inoltra dichiarare il "blocco" classe. Inoltre, sposta l'implementazione delle funzioni della scheda dalla definizione della classe.

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

Altri suggerimenti

  1. Inoltra-dichiara la tua classe block prima di board con questa riga:

    blocco di classe;

  2. Posiziona il codice dei corpi funzione DOPO le dichiarazioni di entrambe le classi. La dichiarazione in avanti della tua classe non rende disponibili tutte le sue funzioni, ma consente solo al compilatore di sapere che tale classe esiste. Permette solo di usare, ad esempio, i puntatori a tale classe (perché la dimensione del tipo di puntatore non dipende dal layout della classe).

Questo può essere facilmente rimosso con una dichiarazione in avanti. Dato che board non ha bisogno di sapere molto sulla classe block , solo che usa un puntatore ad esso, dichiaralo prima. ma prima includi una dichiarazione diretta per block . Sembra così:

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;

};

Questo è di solito un problema di progettazione. Ti suggerisco di scegliere la classe più piccola (nel tuo caso suggerirei la classe di blocco) e codificare alcuni eventi su di essa che la classe board firmerebbe. Quindi, invece di chiamare il metodo della classe board, spara l'evento e lascia che la classe board lo chiami da sola.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top