سؤال

أنا أعاني من بعض المشاكل مع الدرجة لأن كلا منهما يعتمد على الآخر ، لا يمكن للمرء أن يعلن دون الآخر يتم تعريفه.

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. وضع رمز الوظيفة الهيئات بعد تصريحات من كل الطبقات.إلى الأمام-إعلان صفك لا تجعل جميع الوظائف متاحة فقط يسمح للمترجم أن نعرف أن هذه الفئة موجودة.فإنه يسمح فقط للاستخدام على سبيل المثال مؤشرات إلى مثل هذه الدرجة (لأن الحجم من نوع مؤشر لا تعتمد على تخطيط الصف).

ويمكن بسهولة أن resoved ذلك مع إعلان الأمام. منذ 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