рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╕рдореНрдорд╛рдирд┐рдд
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;
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд┐рдВрдкрд▓ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рднреА рддрд░реАрдХреЗ (рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ
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 {
рдЕрдм, рдкрджреНрдзрддрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ
_d
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ
d_func()
рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
void Class::f() const { const Private * d = f_func();
рдмреЗрд╢рдХ, рдХреБрдЫ рднреА рддрд░реАрдХреЛрдВ рдореЗрдВ
_d
рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░
deep_const_ptr
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП,
Class
рдХреЗ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд╢рд╛рд╕рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
deep_const_ptr
рд╡рд░реНрдЧ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЛ
Class
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдкрд░ рдмрдирд╛рдИ рдЧрдИ
Private
рд╡рд╕реНрддреБ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рдмрд╣реБрд░реВрдкреА рд╡рд░реНрдЧреЛрдВ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХрдВрдЯреЗрдирд░ рдХреНрд▓рд╛рд╕ рддрдХ рдкрд╣реБрдВрдЪ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рдзрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдбреЗрд╡рд▓рдкрд░
Class
рд╕рднреА
private
рддрд░реАрдХреЛрдВ рдХреЛ
private
рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ: рдЕрдм рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЖрдк
Class
рдЕрдиреНрдп (рдЧреИрд░-
static
) рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдиреЗрдХреНрд╢рди
Class -> Private
рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рд╣реИ:
class Class::Private { public: Private() : ... {}
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдмреИрдХрд▓рд┐рдВрдХ (
q
рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдХреНрдпреВ рдХреЛрдб рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
class Class::Private { Class * const q;
Backreference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐
Private
рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рддрдХ
d
рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдбреЗрд╡рд▓рдкрд░ рдХреЛ
Private
рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ
d
рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ
Class
рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЙрд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓реЗрдЧрд╛ред
рдкреБрдирд░реНрдмреАрдорд╛ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рдмреИрдХрд▓ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдмреИрдХрд▓рд┐рдВрдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░
Class
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ,
Private
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕рд╣реА рд▓рд┐рдВрдХ рд╡реИрд▓реНрдпреВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
class Class::Private { Class * const q;
рдЙрдкрд░реЛрдХреНрдд рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЖрдорддреМрд░ рдкрд░ рд╡рд░реНрдЧ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛
Private
рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐
q
рдкреЙрдЗрдВрдЯрд░ (рдмреИрдХрд╡рд░реНрдб рд▓рд┐рдВрдХ) рдХреЗ рд╕рд╛рде, рдХрдмреНрдЬ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдЪрд╛рд░рд┐рдд рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдк-рдпреЛрдЧреЛрдВ
рдЕрдм рдЬрдм рд╣рдо Pimpl рдореБрд╣рд╛рд╡рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдЬреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдЦреЛ рдЧрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢реЗрд╖ рд▓реЗрдЦ рдХреБрдЫ "рдЬрд╛рджреВ" рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдореГрддрд┐ рд▓рд╛рдЧрддреЛрдВ рдХреЛ рд╕рдорддрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдХрд┐ Pimpl рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред
рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░
рдПрдХ рдЕрдЪреНрдЫрд╛ C ++ рдбреЗрд╡рд▓рдкрд░ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдкрд╛рдардХ рд╢рд╛рдпрдж рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд┐рдореНрдкрд▓ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдЦ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдВрджреЗрд╣ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмреЗрд╣рдж рдиреБрдХрд╕рд╛рдирджреЗрд╣ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЦреБрдж рдХреЛ рд▓рдЧрднрдЧ рд╕реНрдореГрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░рдХреЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрд▓рд╛рд╕ рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЧрдИ рдереАред рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдФрд░, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рддрдХрдиреАрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реВрдЪрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧред
рдмрд╣реБрд░реВрдкрддрд╛ рд╡рд░реНрдЧреЛрдВ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдореГрддрд┐ рд▓рд╛рдЧрдд рдХреА рд╕рдорд╕реНрдпрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╡рд░реНрдЧ рдХрд╛ рдЕрдкрдирд╛ рдЫрд┐рдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдирдП рдлрд╝реАрд▓реНрдбреНрд╕ рди рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛)ред
рдбреЗрд╡рд▓рдкрд░ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ
d
рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
d
d
рдкреЙрдЗрдВрдЯрд░реНрд╕ (рдФрд░ рд╕рдВрдмрджреНрдз рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди) рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реИ:
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд
protected
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдореМрдЬреВрджрдЧреА рд╕реЗ рд╡рд░реНрдЧ рдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЕрдкрдиреЗ
d
рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдХреЛрдб рднреА
const
рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рд╡рд╛рд▓реЗ рд╡рд░реНрдЧреЛрдВ рдХреА (рдЧреИрд░-рд╕рдВрд╢реЛрдзрд┐рдд) рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП
d_func()
рд╡рд┐рдзрд┐рдпреЛрдВ (рдЬреЛ рдЕрдм
protected
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ
const
рд╢реБрджреНрдзрддрд╛ рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЕрдм,
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 )
рди рдХреЗрд╡рд▓
Derived
рдХреА рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди dereferencing рдкрд░ рдмрдирд╛рдпрд╛
Derived
, рд▓реЗрдХрд┐рди рдпрд╣ рднреА - рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдЧреИрд░-рдкреЙрд▓реАрдлрд╝реЙрд░реНрдорд▓ рдорд╛рдорд▓реЗ рд╕реЗ рдЕрдВрддрд░ рд╣реИ -
Base
, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛
Private
рдХреНрд╖реЗрддреНрд░ рдЕрднреА рднреА рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдПрдХ
null
рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реЗ рд▓рд┐рдВрдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреИрдХрд╡рд░реНрдб рд▓рд┐рдВрдХ рдХреЛ рд╕рд╣реА рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЙрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде рд░рд╣рддрд╛ рд╣реИ, рдЬреЛ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ рдЕрдкрдиреЗ
Private
рд╡рд░реНрдЧ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
Derived
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
Derived::Derived() : Base( new Private ) { d_func()->_q = this; }
рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐
Private::init()
(рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ
Private
рдирд┐рд░реНрдорд╛рдг
Private::init()
рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдХ рдкрд┐рдЫрдбрд╝реЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ (рдХреЗрд╡рд▓) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ
Derived
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред
Derived::Derived( Private * d ) : Base( d ) {
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ
Private
рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдмреИрдХрд╡рд░реНрдб рд╕рдВрджрд░реНрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛
q_func()
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ
Base::Private
рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрджрд░реНрдн рдХреЗ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдВрдЧреЗред рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рд▓рд┐рдЦрдирд╛ рдПрдХ рд╕рдореНрдорд╛рдирд┐рдд рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рд╕рдорд╛рдзрд╛рди
рд╣реЗрдЗрдЬрд╝ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдкрд░ "рдкрдВрдк"
1 Shape
рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз C ++ рдореБрд╣рд╛рд╡рд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, Pimpl рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрд╕ рд╕реАрдорд╛ рддрдХ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ C ++ рдирд┐рд░реНрдорд┐рдд рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИред рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдкреНрд░рднрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рддреЗрдЬреА рд╕реЗ рд╕рдВрдХрд▓рди, рд▓реЗрдирджреЗрди рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ, рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддреНрд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред
d
рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд
Private
рд╡рд░реНрдЧ, рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди,
const
рдЙрд▓реНрд▓рдВрдШрди рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рдХреНрдд рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрдврд╝реА рд╣реБрдИ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг, рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдЕрдкрдЧреНрд░реЗрдб" рдкрд┐рдореНрдкрд▓ (рдкреБрди: рдЙрдкрдпреЛрдЧ рдФрд░ рдЯреНрд░реИрдХрдмреИрдХ рдХреЗ рд╕рд╛рде) рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рд╡рд░реНрдЧреЛрдВ рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рд╕реЗ рдбрд░рддреА рдирд╣реАрдВ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╕реНрдерд┐рд░рддрд╛ рд╕реЗ рдкреБрд░рд╕реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
- рдЬреЙрди рд▓реИрдХреНрд╕; рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕реА ++ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд┐рдЬрд╛рдЗрди; рдПрдбрд┐рд╕рди-рд╡реЗрд╕реНрд▓реЗ рд▓реЙрдиреНрдЧрдореИрди, 1996
- рдЬрдбрд╝реА рдмреВрдЯреА рд╕рдЯрд░; рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реА ++: 47 рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдкрд╣реЗрд▓рд┐рдпрд╛рдБ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ, рдФрд░ рд╕рдорд╛рдзрд╛рди; рдПрдбрд┐рд╕рди-рд╡реЗрд╕реНрд▓реЗ рд▓реЙрдиреНрдЧрдореИрди, 2000
- рд╣рд░реНрдм рд╕рдЯрд░, рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ: рд╕реА ++ рдХреЛрдбрд┐рдВрдЧ рдорд╛рдирдХ: 101 рдирд┐рдпрдо, рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕; рдПрдбрд┐рд╕рди-рд╡реЗрд╕реНрд▓реЗ рд▓реЙрдиреНрдЧрдореИрди, 2004
- рдорд╛рд░реНрдХ рдореБрддреНрдЬрд╝; рдореЗрд░реЗ рдкрд┐рдВрдкрд▓ рдХреЛ рдкрд┐рдВрдкрд▓ рдХрд░реЗрдВ; C ++: Vor- und Nachteile des d-Zeiger-Idioms, Teil 1; Artikel auf heise рдбреЗрд╡рд▓рдкрд░ ( рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рдЕрдиреБрд╡рд╛рдж рдЙрдкрд▓рдмреНрдз )
рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдиреЛрдЯреНрд╕
1 рдЗрд╕рдХреЗ рдмрд╛рдж: рд╢рдмреНрджреЛрдВ рдкрд░ рдПрдХ рдирд╛рдЯрдХ - рдкрд┐рдореНрдкрд▓ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рджрд▓рд╛рд▓ рдХреЗ рд╕рд╛рде рд╡реНрдпрдВрдЬрди рд╣реИ, рдЬреЛ рдЯреЗрд▓реАрд╡рд┐рдЬрди рд╢реЛ "рдкрд┐рдореНрдк рдорд╛рдп рд░рд╛рдЗрдб" (рдЕрдВрдЧреНрд░реЗрдЬреА "рдкрд┐рдореНрдк рдорд╛рдп рд░рд╛рдЗрдб") рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред