Вопрос

У меня есть некоторые проблемы с моим классом, потому что они оба зависят друг от друга, так как один не может быть объявлен без объявления другого.

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;

};

Как вы можете видеть " блок " класс должен знать, что такое "доска" есть и наоборот. Заранее спасибо!

Это было полезно?

Решение

Определить " доску " перед " блокировать " и вперёд объявляем «блок» учебный класс. Также переместите реализацию функций Board из определения класса.

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

Другие советы

<Ол>
  • Объявите ваш класс block перед board следующей строкой:

    блок классов;

  • Поместите код тела функций ПОСЛЕ объявлений обоих классов. Объявление класса вперед не делает все его функции доступными, оно просто позволяет компилятору знать, что такой класс существует. Это просто позволяет использовать, например, указатели на такой класс (поскольку размер типа указателя не зависит от макета класса).

  • Это можно легко восстановить с помощью предварительной декларации. Поскольку board не нужно ничего знать о классе block , а только о том, что он использует указатель на него, объявите его первым. но перед этим включите предварительное объявление для block . Это выглядит так:

    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;
    
    };
    

    Обычно это проблема дизайна. Я предлагаю вам выбрать меньший класс (в вашем случае я бы предложил класс блока) и кодировать на нем некоторые события, которые подпишет класс доски. Затем вместо того, чтобы вызывать метод класса Board, снимите событие и позвольте классу Board вызвать его самостоятельно.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top