قواعد الإدراج في رأس الملفات عند استخدام نوع في typedef
-
08-07-2019 - |
سؤال
إن إنشاء
typedef double (MyClass::*MemFuncGetter)();
في ملف رأس, هل أنا بحاجة إلى إدراج "MyClass.ح" أو إلى الأمام معلنا يكفي ؟
عنوان الملف:
#ifndef _TEST_
#define _TEST_
#include "MyClass.h" //do I need this?
//or I can just say class MyClass;
typedef double (MyClass::*MemFuncGetter)();
#endif
ما هي قواعد الربط هنا ؟
المحلول
كنت على ما يرام مع فقط إلى الأمام إعلان الدرجة:
#ifndef _TEST_
#define _TEST_
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
#endif
ولكن لاحظ أن كل فئة المترجم له للقيام بعمل إضافي للتعامل مع الحالات عندما MyClass متعددة الظاهري الميراث الفوضى ، لأنه لا يعرف.في بعض الحالات وهذا يمكن أن يعني أن كل وظيفة المؤشر في الواقع يستغرق ما يصل إلى 20 بايت من الذاكرة.في حين إذا كنت قد حددت كله ، كل وظيفة المؤشر إلا 4.(طبعا جميع الأحجام مترجم-معال).
نصائح أخرى
تحتاج إلى أن يكون على الأقل إعلان MyClass
في نطاق -- إلى الأمام إعلان على الأقل.الرموز المميزة ل Typedef إنشاء اسم مستعار.ولكنها لا تخلق نوع جديد أو تغيير الربط.الربط سيتم من MemFuncGetter
.
نعم إلى الأمام declraing بما فيه الكفاية.
إنشاء ملف MyClassFwd.ح و وضع هناك
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
وتشمل قدما decl - أن يكون كافيا.لا نسخ ولصق الرموز المميزة ل typedef.في 'MyClass.ح' ببساطة تشمل 'MyClassFwd.ح'