рдкрд┐рдореНрдкрд▓ рдорд╛рдп рдкрд┐рдореНрдкрд▓ рдХрд╛ рдЕрдиреБрд╡рд╛рдж, рднрд╛рдЧ 2

рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╕рдореНрдорд╛рдирд┐рдд skb7 рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд, Pimpl рдореБрд╣рд╛рд╡рд░реЗ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ), рдЗрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдлрд╛рдпрджреЗ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рдереАред рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЗрд╕ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рднреА рд╕реБрдЭрд╛рдПрдВрдЧреЗред

рдореВрд▓ рдХреЗ рд▓рд┐рдВрдХ


рдпрд╣ рд╣рд╛рдЗрдЬ рдбреЗрд╡рд▓рдкрд░ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдХ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИред рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рджреЛрдиреЛрдВ рднрд╛рдЧреЛрдВ рдХреЗ рдореВрд▓ (рдЬрд░реНрдорди рдореЗрдВ) рдпрд╣рд╛рдБ рдФрд░ рдпрд╣рд╛рдБ рд╣реИрдВ ред

рдЕрдиреБрд╡рд╛рдж рдПрдХ рдЕрдВрдЧреНрд░реЗрдЬреА рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдореВрд░реНрдд


рдЗрд╕ рдЕрдЬреАрдм-рдЕрдЬреАрдм рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдбреА-рдкреЙрдЗрдВрдЯрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдпрд╛ рдЪреЗрд╢рд╛рдпрд░ рдХреИрдЯ рдХреЗ рдирд╛рдо рд╕реЗ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдЗрдЬрд╝ рдбреЗрд╡рд▓рдкрд░ рдореЗрдВ рдкрд╣рд▓рд╛ рд▓реЗрдЦ, рдЬрд┐рд╕рдиреЗ рдкрд┐рдореНрдкрд▓ рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ, рдЗрд╕ рджреВрд╕рд░реЗ рдФрд░ рдЕрдВрддрд┐рдо рд▓реЗрдЦ рдХреЗ рдмрд╛рдж рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкрд┐рдВрдкрд▓ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред

рднрд╛рдЧ реи


рд▓рдЧрд╛рддрд╛рд░ рдЙрд▓реНрд▓рдВрдШрди

рдкрд╣рд▓рд╛ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреВрд░ рд╣реИ, рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред Pimpl рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рдзрд┐рдпрд╛рдБ d рд╕реВрдЪрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИрдВ:
 SomeThing & Class::someThing() const { return d->someThing; } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдб C ++ рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЛ someThing() рджреЗрддрд╛ рд╣реИ: рдЪреВрдВрдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ someThing() рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ someThing() рдкреНрд░рдХрд╛рд░ someThing() рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ this рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ const Class * , рдФрд░ рд╕реВрдЪрдХ d рдХреНрд░рдорд╢рдГ, рдкреНрд░рдХрд╛рд░ Class::Private * const ред рдпрд╣, рд╣рд╛рд▓рд╛рдВрдХрд┐, Class::Private рд╡рд░реНрдЧ рд╕реЗ рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдБрдЪ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ d рд╣рд╛рд▓рд╛рдВрдХрд┐ d рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдерд┐рд░ рд╣реИ, рд▓реЗрдХрд┐рди *d рдирд╣реАрдВ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ: C ++ рдореЗрдВ, const рд╕рдВрд╢реЛрдзрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИ:
 const int * pci; //    int int * const cpi; //    int const int * const cpci; //     int *pci = 1; // : *pci  *cpi = 1; // : *cpi   *cpci = 1; // : *cpci  int i; pci = &i; //  cpi = &i; // : cpi  cpci = &i; // : cpci  

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд┐рдВрдкрд▓ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рднреА рддрд░реАрдХреЗ (рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ const рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдордиреЗ рдкрд┐рдореНрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реЛрддрд╛, рддреЛ рд╕рдВрдХрд▓рдХ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рджреЛрд╖ рдЖрдорддреМрд░ рдкрд░ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдЖрд╡рд░рдг рд╡рд░реНрдЧ deep_const_ptr рдпрд╛ d_func() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реАред рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЪрдпрдирд┐рдд рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдХрдмреНрдЬ рд▓рдЧрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 template <typename T> class deep_const_ptr { T * p; public: explicit deep_const_ptr( T * t ) : p( t ) {} const T & operator*() const { return *p; } T & operator*() { return *p; } const T * operator->() const { return p; } T * operator->() { return p; } }; 

operator*() рдФрд░ operator->() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░рдВрддрд░ рдФрд░ рдирд┐рдпрдорд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, *d рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ d рдкреЙрдЗрдВрдЯрд░ рдирд┐рд░рдВрддрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред Private *d рдЬрдЧрд╣ deep_const_ptr<Private> d рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╢реНрди рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдмреЗрдорд╛рдиреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдУрд╡рд░рд░рд┐рдкрд┐рдВрдЧ рдбреЗрд░реЗрдлреЗрд░реЗрдВрд╕ рдСрдкрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЪрд╛рд▓ рдХреЛ рд╕реАрдзреЗ Class рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 class Class { // ... private: const Private * d_func() const { return _d; } Private * d_func() { return _d; } private: Private * _d; }; 

рдЕрдм, рдкрджреНрдзрддрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ _d рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ d_func() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
 void Class::f() const { const Private * d = f_func(); //  'd' ... } 

рдмреЗрд╢рдХ, рдХреБрдЫ рднреА рддрд░реАрдХреЛрдВ рдореЗрдВ _d рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ deep_const_ptr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, Class рдХреЗ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд╢рд╛рд╕рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, deep_const_ptr рд╡рд░реНрдЧ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЛ Class рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдкрд░ рдмрдирд╛рдИ рдЧрдИ Private рд╡рд╕реНрддреБ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рдмрд╣реБрд░реВрдкреА рд╡рд░реНрдЧреЛрдВ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХрдВрдЯреЗрдирд░ рдХреНрд▓рд╛рд╕ рддрдХ рдкрд╣реБрдВрдЪ

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рдзрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдбреЗрд╡рд▓рдкрд░ Class рд╕рднреА private рддрд░реАрдХреЛрдВ рдХреЛ private рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ: рдЕрдм рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЖрдк Class рдЕрдиреНрдп (рдЧреИрд░- static ) рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдиреЗрдХреНрд╢рди Class -> Private рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рд╣реИ:
 class Class::Private { public: Private() : ... {} // ... void callPublicFunc() { /*???*/Class::publicFunc(); } }; Class::Class() : d( new Private ) {} 

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдмреИрдХрд▓рд┐рдВрдХ ( q рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдХреНрдпреВ рдХреЛрдб рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 class Class::Private { Class * const q; //   public: explicit Private( Class * qq ) : q( qq ), ... {} // ... void callPublicFunc() { q->publicFunc(); } }; Class::Class() : d( new Private( this ) ) {} 

Backreference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ Private рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рддрдХ d рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдбреЗрд╡рд▓рдкрд░ рдХреЛ Private рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ d рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ Class рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЙрд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓реЗрдЧрд╛ред

рдкреБрдирд░реНрдмреАрдорд╛ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рдмреИрдХрд▓ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдмреИрдХрд▓рд┐рдВрдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ Class рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, Private рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕рд╣реА рд▓рд┐рдВрдХ рд╡реИрд▓реНрдпреВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 class Class::Private { Class * const q; // back-link public: explicit Private( /*Class * qq*/ ) : q( 0 ), ... {} // ... }; Class::Class() : d( new Private/*( this )*/ ) { //   : d->q = this; } 

рдЙрдкрд░реЛрдХреНрдд рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЖрдорддреМрд░ рдкрд░ рд╡рд░реНрдЧ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Private рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ q рдкреЙрдЗрдВрдЯрд░ (рдмреИрдХрд╡рд░реНрдб рд▓рд┐рдВрдХ) рдХреЗ рд╕рд╛рде, рдХрдмреНрдЬ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдЪрд╛рд░рд┐рдд рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдк-рдпреЛрдЧреЛрдВ

рдЕрдм рдЬрдм рд╣рдо Pimpl рдореБрд╣рд╛рд╡рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдЬреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдЦреЛ рдЧрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢реЗрд╖ рд▓реЗрдЦ рдХреБрдЫ "рдЬрд╛рджреВ" рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдореГрддрд┐ рд▓рд╛рдЧрддреЛрдВ рдХреЛ рд╕рдорддрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдХрд┐ Pimpl рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред

рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░

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

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

рдмрд╣реБрд░реВрдкрддрд╛ рд╡рд░реНрдЧреЛрдВ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдореГрддрд┐ рд▓рд╛рдЧрдд рдХреА рд╕рдорд╕реНрдпрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╡рд░реНрдЧ рдХрд╛ рдЕрдкрдирд╛ рдЫрд┐рдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдирдП рдлрд╝реАрд▓реНрдбреНрд╕ рди рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛)ред

рдбреЗрд╡рд▓рдкрд░ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ d рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ d d рдкреЙрдЗрдВрдЯрд░реНрд╕ (рдФрд░ рд╕рдВрдмрджреНрдз рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди) рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реИ:
 // base.h: class Base { // ... public: Base(); protected: class Private; explicit Base( Private * d ); Private * d_func() { return _d; } const Private * d_func() const { return _d; } private: Private * _d; }; // base.cpp: Base::Base() : _d( new Private ) { // ... } Base::Base( Private * d ) : _d( d ) { // ... } 

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд protected рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдореМрдЬреВрджрдЧреА рд╕реЗ рд╡рд░реНрдЧ рдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЕрдкрдиреЗ d рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдХреЛрдб рднреА const рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рд╡рд╛рд▓реЗ рд╡рд░реНрдЧреЛрдВ рдХреА (рдЧреИрд░-рд╕рдВрд╢реЛрдзрд┐рдд) рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП d_func() рд╡рд┐рдзрд┐рдпреЛрдВ (рдЬреЛ рдЕрдм protected ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ const рд╢реБрджреНрдзрддрд╛ рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
 // derived.h: class Derived : public Base { public: Derived(); // ... protected: class Private; Private * d_func(); //    const Private * d_func() const; //  }; // derived.cpp: Derived::Private * Derived::d_func() { return static_cast<Private*>( Base::d_func() ); } const Derived::Private * Derived::d_func() const { return static_cast<const Private*>( Base::d_func() ); } Derived::Derived() : Base( new Private ) {} 

рдЕрдм, Derived рд▓реЗрдЦрдХ Derided::Private рдмрдЬрд╛рдп Base::Private to Base::_d (рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕рдорд╛рди Private рдирд╛рдо рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ) рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП Base рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦрдХ Base рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ d_func() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬрдмрд░рди рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

Base рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Base::Private рдХрд╛ рдкреВрд░реНрд╡рдЬ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ Derived::Private :
 class Derived::Private : public Base::Private { // ... }; 

Base::Private рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреАрди рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ Base::Private рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП Base::Private рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЖрднрд╛рд╕реАред рдЕрдиреНрдпрдерд╛, Base рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рдкрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛, рдЬреЛ Base::Private рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Derived::Private рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред

рджреВрд╕рд░реЗ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ Private рдЖрдорддреМрд░ рдкрд░ рдирд┐рд░реНрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ - рд╡реЗ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ declspec(dllexport) рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ visibility=hidden ELF рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдореЗрдВ visibility=hidden рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирд┐рд░реНрдпрд╛рдд рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ рдпрджрд┐ Base рдФрд░ Derived рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП Derived ред рдЕрд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдореБрдЦреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ Private рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЛрдХрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ QObjectPrivate (QtCore рд╕реЗ) рдФрд░ QWidgetPrivate (QtGui рд╕реЗ) рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛, рдЬреЛ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ QObject рдФрд░ QWidget рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд░реНрдЧред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рди рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрддрд░ рдкрд░, рдмрд▓реНрдХрд┐ " libQtGui.so.4.5.0 " рд╕реНрддрд░ рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕рдВрдЧрддрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВ: рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, libQtGui.so.4.5.0 рдЧрддрд┐рд╢реАрд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рд▓рд┐рдВрдХрд░ рдЗрд╕рдореЗрдВ libQtCore.so.4.6.0 рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рддреАрд╕рд░рд╛, Base::Private рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдм рдмреЗрд╕ рдХреНрд▓рд╛рд╕ base.cpp рдлрд╛рдЗрд▓ ( base.cpp ) рдореЗрдВ рдЫрд┐рдкреА рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Derived::Private рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ Base::Private рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдП Base::Private ? рдЖрдк рдЗрд╕реЗ рдмрд╕ base.h рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ Pimpl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рд╣реИ рдпрджрд┐ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рднреА рдмрд╛рд╣рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ? рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдПрдХ рд╡рд┐рд╢реЗрд╖, рдирд┐рдЬреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, Qt рдФрд░ KDE рдиреЗ _p.h (рдкреНрд░рддреНрдпрдп _priv , _i рдФрд░ _impl рднреА _impl ) рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдордХрд░рдг рдпреЛрдЬрдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХреА рд╣реИред Base::Private рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ Base::Private , рдпрд╣ рдирд┐рдЬреА рдлрд╝рд╛рдЗрд▓ Base рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ inline рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛:
 inline Base::Base( Private * d ) : _d( d ) {} 

рдФрд░ derived_p.h :
 inline Derived::Derived( Private * d ) : Base( d ) {} inline const Derived::Private * Derived::d_func() const { return static_cast<const Private*>( Base::d_func() ); } inline Derived::Private * Derived::d_func() { return static_cast<Private*>( Base::d_func() ); } 

рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓рдирд╛, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╡рди рдбреЗрдлрд┐рдирд┐рд╢рди рд░реВрд▓ рдирд┐рдпрдо рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ d_func() рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рд╣реИрдВ рдЬреЛ derived_p.h , рдФрд░ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рдирд╣реАрдВ рд╣реИрдВред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рдХреЛрдИ рднреА d_func() рдХреЛ d_func() рд╣реИ, рдЙрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ derived_p.h рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ derived_p.h ред рдкреБрдирд░реНрдмреАрдорд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк Derived рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ inline рд░реВрдк рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рддрд░реАрдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╛рдЗрд▓ рдореЗрдВ Derived рдкрд░рд┐рднрд╛рд╖рд╛ - рдЖрдзреБрдирд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рддрд░реАрдХреЛрдВ рдореЗрдВ inline рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЕрдХреНрд╕рд░, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдирд┐рд░рд░реНрдердХ рдХреЛрдб рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рддрд╣рдд рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Qt рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ Q_DECLARE_PRIVATE рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореИрдХреНрд░реЛ Q_D , рдЬреЛ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ d рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ d_func() рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдЦрд╛рдореА рдлрд┐рд░ рднреА рдмрдиреА рд╣реБрдИ рд╣реИ: рдпрджрд┐ рдбреЗрд╡рд▓рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреЙрдЗрдВрдЯрд░ рдФрд░ рдмреИрдХрд▓рд┐рдВрдХ рддрдВрддреНрд░ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рджреЗрдЦрднрд╛рд▓ рдХреЛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднреА!) рд╕реВрдЪрдХ рдХреЛ Derived рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ Private рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛рд░реНрдп рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 Derived::Private( Derived * qq ) : Base( qq ) // ,   { q->setFoo( ... ); // ,     } 

рди рдХреЗрд╡рд▓ Derived рдХреА рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди dereferencing рдкрд░ рдмрдирд╛рдпрд╛ Derived , рд▓реЗрдХрд┐рди рдпрд╣ рднреА - рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдЧреИрд░-рдкреЙрд▓реАрдлрд╝реЙрд░реНрдорд▓ рдорд╛рдорд▓реЗ рд╕реЗ рдЕрдВрддрд░ рд╣реИ - Base , рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ Private рдХреНрд╖реЗрддреНрд░ рдЕрднреА рднреА рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдПрдХ null рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реЗ рд▓рд┐рдВрдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреИрдХрд╡рд░реНрдб рд▓рд┐рдВрдХ рдХреЛ рд╕рд╣реА рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЙрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде рд░рд╣рддрд╛ рд╣реИ, рдЬреЛ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ рдЕрдкрдиреЗ Private рд╡рд░реНрдЧ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред Derived рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 Derived::Derived() : Base( new Private/*( this )*/ ) { d_func()->_q = this; } 

рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ Private::init() (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ Private рдирд┐рд░реНрдорд╛рдг Private::init() рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдХ рдкрд┐рдЫрдбрд╝реЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ (рдХреЗрд╡рд▓) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ Derived рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред
 Derived::Derived( Private * d ) : Base( d ) { // __  d->init()! } Derived::Derived() : Base( new Private ) { d_func()->init( this ); } Derived::Private::init( Derived * qq ) { Base::Private::init( qq ); //  _q //    } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ Private рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдмреИрдХрд╡рд░реНрдб рд╕рдВрджрд░реНрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ q_func() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Base::Private рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрджрд░реНрдн рдХреЗ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдВрдЧреЗред рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рд▓рд┐рдЦрдирд╛ рдПрдХ рд╕рдореНрдорд╛рдирд┐рдд рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЗрдЗрдЬрд╝ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдкрд░ "рдкрдВрдк" 1 Shape рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз C ++ рдореБрд╣рд╛рд╡рд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, Pimpl рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрд╕ рд╕реАрдорд╛ рддрдХ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ C ++ рдирд┐рд░реНрдорд┐рдд рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИред рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдкреНрд░рднрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рддреЗрдЬреА рд╕реЗ рд╕рдВрдХрд▓рди, рд▓реЗрдирджреЗрди рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ, рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддреНрд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

d рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд Private рд╡рд░реНрдЧ, рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди, const рдЙрд▓реНрд▓рдВрдШрди рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рдХреНрдд рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрдврд╝реА рд╣реБрдИ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг, рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдЕрдкрдЧреНрд░реЗрдб" рдкрд┐рдореНрдкрд▓ (рдкреБрди: рдЙрдкрдпреЛрдЧ рдФрд░ рдЯреНрд░реИрдХрдмреИрдХ рдХреЗ рд╕рд╛рде) рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рд╡рд░реНрдЧреЛрдВ рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рд╕реЗ рдбрд░рддреА рдирд╣реАрдВ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╕реНрдерд┐рд░рддрд╛ рд╕реЗ рдкреБрд░рд╕реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ




рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдиреЛрдЯреНрд╕


1 рдЗрд╕рдХреЗ рдмрд╛рдж: рд╢рдмреНрджреЛрдВ рдкрд░ рдПрдХ рдирд╛рдЯрдХ - рдкрд┐рдореНрдкрд▓ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рджрд▓рд╛рд▓ рдХреЗ рд╕рд╛рде рд╡реНрдпрдВрдЬрди рд╣реИ, рдЬреЛ рдЯреЗрд▓реАрд╡рд┐рдЬрди рд╢реЛ "рдкрд┐рдореНрдк рдорд╛рдп рд░рд╛рдЗрдб" (рдЕрдВрдЧреНрд░реЗрдЬреА "рдкрд┐рдореНрдк рдорд╛рдп рд░рд╛рдЗрдб") рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред

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


All Articles