مرحبا بالجميع! عند تنفيذ المشروعات ، غالبًا ما يحتاج المطورون إلى فئات تحتوي على حقول فقط وليس لديهم أي وظائف. هذه الفئات مفيدة لتخزين المعلومات اللازمة مع التلاعب بها لاحقا.
ويستند النهج الأول لتنفيذ هذه الفئات على استخدام الهياكل جيم. وكعيب في هذا النهج ، فهو أن جميع الحقول قابلة للكتابة وقابلة للقراءة ، وهي ليست جيدة دائمًا.
struct person { int id; human type; std::string name; std::string address[5]; bool merried; };
يستند الأسلوب الثاني على إخفاء جميع الحقول وتوفير getters و setters للحقول. يستخدم هذا النهج بشكل واضح في لغة جافا. كميزة ، يمكننا التحكم في الوصول إلى الحقول. وتشمل عيوب حقيقة أن الطبقة تصبح كبيرة ، والألعاب والمستوطنين لا تحمل عبئا منطقيا.
class person { public: void set_id(int id) { this->id = id; } int get_id() const { return id; } void set_merried(bool merried) { this->merried = merried; } bool is_merried() const { return merried; } void set_type(human type) { this->type = type; } human get_type() const { return type; } void set_name(const std::string& name) { this->name = name; } const std::string& get_name() const { return name; } private: int id; human type; std::string name; std::string address[5]; bool merried; };
إذا كان الحقل نوعًا للفئة ، فأنت في بعض الأحيان تحتاج إلى تعيين الكائن حسب القيمة ، بواسطة ارتباط lvalue ، بواسطة ارتباط rvalue. وأيضا باستخدام const / المعدلات المتقلبة.
class person { public: void set_name(const std::string& name) { this->name = name; } void set_name(std::string&& name) { this->name = std::move(name); } const std::string& get_name() const { return name; } private: int id; human type; std::string name; std::string address[5]; bool merried; };
تدعم العديد من اللغات الخصائص كميزة اللغة. رمز الكتابة يصبح أنظف وأكثر موثوقية. لتبسيط كتابة الحروف والأدوات ، يمكنك استخدام وحدات الماكرو لإنشاء التعليمات البرمجية.
#define SETTER_PRIM(type, name) \ void set_##name(type value) { \ this->name = value; \ } #define GETTER_PRIM(type, name) \ type get_##name() const { \ return name; \ }
لكن استخدام وحدات الماكرو أمر خطير. قد لا نشير بشكل صحيح إلى النوع (النوع) أو متغير النوع الخاطئ (الاسم). في أفضل الأحوال ، حصلنا على خطأ وقت التشغيل عند استخدام getters و setters. في أسوأ الحالات ، سيبقى الخطأ.
كنت أرغب في أن نكون قادرين على توليد الحروف والأدوات ، لكن في نفس الوقت يمكننا التحقق من صحة النوع (النوع) ، صحة النوع مع متغير (الاسم) وأن الأنواع متساوية. ويمكن القيام بذلك بدءًا من الإصدار C ++ 11 باستخدام مكتبة type_traits القياسية.
#define SETTER_PRIM(type, name) \ void set_##name(type value) { \ using T1 = type; \ using T2 = decltype(name); \ static_assert(std::is_fundamental<T1>::value, \ "only primitive types"); \ static_assert(std::is_fundamental<T2>::value, \ "variable must be primitive"); \ static_assert(std::is_same<T1, T2>::value, \ "both types must be same"); \ this->name = value; \ } #define GETTER_PRIM(type, name) \ type get_##name() const { \ using T1 = type; \ using T2 = decltype(name); \ static_assert(std::is_fundamental<T1>::value, \ "only primitive types"); \ static_assert(std::is_fundamental<T2>::value, \ "variable must be primitive"); \ static_assert(std::is_same<T1, T2>::value, \ "both types must be same"); \ return name; \ }
باستخدام هذا النهج ، يمكنك تطبيق getters و setters لجميع أنواع حقول الفصل.
- أنواع بدائية
- أنواع الكائنات
- نقل
- مجموعة
- مؤشرات
- إشارة
جميع وحدات الماكرو للأدوات والتثبيتات المنفذة في شكل مكتبة رأسية فقط. من خلال ربط ملف رأس واحد فقط ، يمكنك بسهولة تنفيذ فئة التاريخ مع جميع الحروف اللازمة وعدادات.
#include "property.hpp" class person { public: person() = default; ~person() = default; SETTER_PRIM(int, id); SETTER_FLAG(bool, merried); SETTER_ENUM(human, type); SETTER_PTR(int, next); SETTER_ARR(std::string, address, 3); SETTER_OBJ_LR(std::string, name); SETTER_OBJ_CLR(std::string, name); SETTER_OBJ_RR(std::string, name); GETTER_PRIM(int, id); GETTER_FLAG(bool, merried); GETTER_ENUM(human, type); GETTER_OBJ_LR(std::string, name); GETTER_OBJ_CLR(std::string, name); GETTER_PTR(int, next); GETTER_ARR(std::string, address); private: int id; human type; std::string name; std::string address[5]; bool merried; int* next; };
يمكن الاطلاع على التعليمات البرمجية المصدر لمكتبة المصادر المفتوحة هنا على هذا
الرابط .