C ++ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдХреНрд╕рд░ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рдирдореЗрдВ рдХреЗрд╡рд▓ рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдирдХреЗ рдХреЛрдИ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдЙрдирдХреЗ рдмрд╛рдж рдХреЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИрдВред

рдРрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХрдореА рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рд▓реЗрдЦрди рдпреЛрдЧреНрдп рдФрд░ рдкрдардиреАрдп рд╣реИрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

struct person { int id; human type; std::string name; std::string address[5]; bool merried; }; 

рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдФрд░ рдЦреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рд╢рдж рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд▓рд╛рдн рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреБрдХрд╕рд╛рди рдореЗрдВ рдпрд╣ рддрдереНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рддрд╛рд░реНрдХрд┐рдХ рдмреЛрдЭ рдирд╣реАрдВ рдЙрдард╛рддреЗ рд╣реИрдВред

 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; }; 

рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдПрдХ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рд╡рд╕реНрддреБ рдХреЛ рдорд╛рди рджреНрд╡рд╛рд░рд╛, рд▓рд╡рд▓реАрди-рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛, рд░рд╡реИрд▓реНрдпреВ-рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдХреЙрдиреНрд╕реНрдЯ / рд╡рд╛рд╖реНрдкрд╢реАрд▓ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

 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; \ } 

рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИред рд╣рдо рд╕рд╣реА рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░) рдпрд╛ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ (рдирд╛рдо) рдХреЗ рдПрдХ рдЪрд░ рдХрд╛ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдмрдиреА рд░рд╣реЗрдЧреАред

рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╣рдо рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рд╣рдо рдЯрд╛рдЗрдк рдХреА рд╢реБрджреНрдзрддрд╛, рд╡реЗрд░рд┐рдПрдмрд▓ (рдирд╛рдо) рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдк рд╕рдорд╛рди рдереЗред рдФрд░ рдпрд╣ 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; \ } 

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  • рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░
  • рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░
  • рд╕реНрдерд╛рдирд╛рдВрддрд░рдг
  • рд╕рд░рдгреА
  • рд╕рдВрдХреЗрдд
  • рд╕рдВрджрд░реНрдн

рд╣реЗрдбрд░-рдУрдирд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдореИрдХреНрд░реЛрдЬрд╝ред рдХреЗрд╡рд▓ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдХреЗ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдбреЗрдЯ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 #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; }; 

рдУрдкрди рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi459212/


All Articles