كيف يمكنك أن ترث من فئة في ملف رأس مختلف؟
-
05-07-2019 - |
سؤال
وأواجه مشاكل التبعية. لدي فئتين: Graphic
وImage
. كل واحد له في .CPP الخاصة والملفات .H. أنا يفيدهم كما يلي:
وGraphic.h
:
#include "Image.h"
class Image;
class Graphic {
...
};
وImage.h
:
#include "Graphic.h"
class Graphic;
class Image : public Graphic {
...
};
وعندما أحاول تجميع، وأحصل على الخطأ التالي:
Image.h:12: error: expected class-name before ‘{’ token
إذا كنت إزالة الإعلان إلى الأمام من Graphic
من Image.h
أحصل على الخطأ التالي:
Image.h:13: error: invalid use of incomplete type ‘struct Graphic’ Image.h:10: error: forward declaration of ‘struct Graphic’
المحلول
وهذا عمل بالنسبة لي:
وImage.h:
#ifndef IMAGE_H
#define IMAGE_H
#include "Graphic.h"
class Image : public Graphic {
};
#endif
وGraphic.h:
#ifndef GRAPHIC_H
#define GRAPHIC_H
#include "Image.h"
class Graphic {
};
#endif
والتعليمة البرمجية التالية بتصنيف مع عدم وجود خطأ:
#include "Graphic.h"
int main()
{
return 0;
}
نصائح أخرى
وأنت لا تحتاج إلى تضمين Image.h أو إلى الأمام تعلن صورة في Graphic.h - وهذا تبعية دائرية. إذا يعتمد Graphic.h على أي شيء في Image.h تحتاج إلى تقسيم ذلك للخروج الى رأس ثالث. (إذا كان لديها الجرافيكي عضو الصور، التي ليست مجرد الذهاب الى العمل.)
وGraphic.h لا تحتاج إلى تضمين image.h، وأنها لا تحتاج إلى إعادة توجيه يعلن الفئة صور. أيضا، Image.h لا تحتاج إلى إعادة توجيه يعلن الطبقة الرسم منذ كنت # تضمين الملف الذي يحدد تلك الفئة (كما يجب).
وGraphic.h:
class Graphic {
...
};
وImage.h
:
#include "Graphic.h"
class Image : public Graphic {
...
};
ومنذ صورة تمتد الجرافيكي، وإزالة إدراج صورة في ملف Graphic.h الخاص بك.
وGraphic.h
class Graphic {
...
};
أولا إزالة هذا، يجب أن يكون دائما تعريف الفئة الكاملة في ترتيب وراثة من فئة:
class Graphic;
والثانية، وإزالة كل ما يشير إلى صورة من Graphic.h. فإن الأم عادة لا تحتاج إلى معرفة من الطفل لها.