문제

나는 둘 다 서로에 의존하기 때문에 수업에 약간의 문제가 있습니다. 다른 하나가 선언되지 않으면 선언 할 수 없습니다.

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;

};

보시다시피 "블록"클래스는 "보드"가 무엇인지 알아야합니다. 미리 감사드립니다!

도움이 되었습니까?

해결책

"블록"전에 "보드"를 정의하고 앞으로 "블록"클래스를 선언하십시오. 또한 보드 기능의 구현을 클래스 정의에서 옮기십시오.

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

다른 팁

  1. 당신의 전방 설명 block 전에 수업 board 이 라인으로 :

    클래스 블록;

  2. 두 클래스의 선언 후에 기능 본문의 코드를 배치하십시오. 수업을 선언하는 것이 모든 기능을 사용할 수있게하는 것은 아니며 컴파일러가 그러한 클래스가 존재한다는 것을 알 수 있습니다. 예를 들어, 포인터 유형의 크기는 클래스의 레이아웃에 의존하지 않기 때문에 그러한 클래스에 포인터를 사용할 수 있습니다.

이것은 선언 선언으로 쉽게 해결할 수 있습니다. 부터 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;

};

이것은 일반적으로 디자인 문제입니다. 나는 당신이 작은 클래스를 선택하고 (당신의 경우 블록 클래스를 제안 할 것입니다) 보드 클래스가 서명 할 이벤트를 코딩하는 것이 좋습니다. 그런 다음 보드 클래스 방법을 호출하는 대신 이벤트를 촬영하고 보드 클래스가 자체라고 부릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top