Зависимости класса C ++ - PullRequest
       37

Зависимости класса C ++

1 голос
/ 12 сентября 2009

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

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;

};

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

Ответы [ 4 ]

10 голосов
/ 12 сентября 2009

Определите «board» перед «block» и далее объявите класс «block». Кроме того, переместите реализацию функций платы из определения класса.

// 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...
6 голосов
/ 12 сентября 2009
  1. Вперед объявите ваш block класс до board с этой строкой:

    блок класса;

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

0 голосов
/ 12 сентября 2009

Это можно легко восстановить с помощью предварительной декларации. Поскольку 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;

};
0 голосов
/ 12 сентября 2009

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

...