Question

J'ai des problèmes avec ma classe car ils dépendent l'un de l'autre, l'un ne peut être déclaré sans que l'autre soit déclaré.

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;

};

Comme vous pouvez le voir, le "bloc" La classe a besoin de savoir ce qu’est un "tableau". est et vice versa. Merci d'avance!

Était-ce utile?

La solution

Définir "conseil" avant " bloquer " et en avant déclarer le "bloc" classe. En outre, déplacez l'implémentation des fonctions de conseil hors de la définition 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...

Autres conseils

  1. Déclarez en avant votre classe block avant la carte avec cette ligne:

    bloc de classe;

  2. Placez le code des corps de fonction APRES les déclarations des deux classes. La déclaration en aval de votre classe ne met pas toutes ses fonctions à disposition, elle permet simplement au compilateur de savoir que cette classe existe. Cela permet simplement d'utiliser, par exemple, des pointeurs sur une telle classe (car la taille du type de pointeur ne dépend pas de la disposition de la classe).

Cela peut facilement être résolu avec une déclaration forward. Puisque board n'a pas besoin de connaître grand chose de la classe block , déclarez-la d'abord. mais avant cela incluez une déclaration forward pour block . Cela ressemble à ceci:

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;

};

Il s’agit généralement d’un problème de conception. Je vous suggère de choisir la classe la plus petite (dans votre cas, je suggérerais la classe de blocs) et de coder quelques événements que la classe de panneau signerait. Ensuite, au lieu d’appeler la méthode board class, tirez l’événement et laissez la classe board l’appeler elle-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top