Pergunta

Eu estou tendo alguns problemas com minha classe porque ambos dependem uns dos outros, para não se pode ser declarado sem o outro que está sendo declarado.

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;

};

Como você pode ver as necessidades de classe "bloquear" para saber o que é um "board" é e vice-versa. Agradecemos antecipadamente!

Foi útil?

Solução

Definir "board" antes "bloco" e para a frente declarar a classe "bloco". Além disso, mover a implementação das funções de tabuleiro para fora da definição de 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...

Outras dicas

  1. Forward-declarar sua classe block antes board com esta linha:

    bloco de classe;

  2. Coloque o código dos corpos função após declarações de ambas as classes. Forward-declarando sua classe não fazer todas as suas funções disponível, ele apenas permite que o compilador saber que existe tal classe. Ele apenas permite o uso, por exemplo, ponteiros para uma classe (porque o tamanho do tipo de ponteiro não depende do layout da classe).

Esta pode ser facilmente resoved com uma declaração para a frente. Desde board não precisa saber nada muito sobre a classe block, só que ele usa um ponteiro para ele, declarar-lo primeiro. mas antes disso incluir uma declaração para a frente para block. Parece que este:

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;

};

Este é geralmente um problema de projeto. Eu sugiro que você pegar a classe menor (no seu caso eu sugiro a classe bloco) eo código de alguns eventos que a classe bordo iria assinar. Então, em vez de chamar o método de classe bordo, disparar o evento e deixe a chamada classe bordo ele próprio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top