dependências da classe C ++
-
06-07-2019 - |
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!
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
-
Forward-declarar sua classe
block
antesboard
com esta linha:bloco de classe;
-
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.