рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдкрд░рд┐рдЪрдп


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

рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рд╛рд╣рд┐рддреНрдп рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╡рд┐рднрд┐рдиреНрди рдЖрд▓реЛрдЪрдирд╛рдУрдВ рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдиреБрдХрд╕рд╛рди рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ :
  1. рд╕рд┐рдВрдЧрд▓рдЯрди рдПрд╕рдЖрд░рдкреА (рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рд┐рджреНрдзрд╛рдВрдд) рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ - рдПрдХрд▓ рд╡рд░реНрдЧ рдЕрдкрдиреА рддрддреНрдХрд╛рд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
  2. рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдкрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд░реНрдЧ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рдХреЗ рдЕрдиреБрдмрдВрдз рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдЪреВрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди getInstance () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рд╕рд┐рдВрдЧрд▓рдЯрди рдкрд░ рд╡рд░реНрдЧ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдмрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдиреБрдмрдВрдз рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк: рдПрдХ рд╕рд┐рдВрдЧреНрд▓рдЯрди рдХреЗ рдмрд╛рдж рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рджреМрд░рд╛рди рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
  3. рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ред рд╣рд░ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рдЦрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕рдиреЗ рдФрд░ рдХрдм рдЗрд╕реЗ рдмрджрд▓рд╛ рд╣реИ, рдФрд░ рдпрд╣ рд░рд╛рдЬреНрдп рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╢реБрджреНрдзрддрд╛ рдЙрд╕ рдкрд░ рдХреЙрд▓ рдХреЗ рдЖрджреЗрд╢ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдЙрдкрдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд░рддреА рд╣реИред
  4. рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдкрд░реАрдХреНрд╖рдгрд╢реАрд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдПрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдореЙрдХ-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдзрдХреНрдХрд╛ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЕрдЧрд░ рдХрд┐рд╕реА рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдХрдИ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХрд▓ рдЧрд╛рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рднреА рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдФрд░ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреЗрдВ, рдЗрд╕ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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

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

рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЗрд╕реЗ C ++ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдпрд╣рд╛рдВ, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдРрд╕реЗ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛:
template<typename T> struct An { An() { clear(); } T* operator->() { return get0(); } const T* operator->() const { return get0(); } void operator=(T* t) { data = t; } bool isEmpty() const { return data == 0; } void clear() { data = 0; } void init() { if (isEmpty()) reinit(); } void reinit() { anFill(*this); } private: T* get0() const { const_cast<An*>(this)->init(); return data; } T* data; }; 

рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрдХреНрд╖рд╛ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдмрд╛рдд, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рдПрдлрд╝рд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ (рдЕрдиреБрдкреНрд░реЗрд░рдг рд╡рд┐рдзрд┐) рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ рднрд░ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрдЧ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрд░рдВрднрд┐рдХ рдФрд░ рдХрд╣рд▓рд╛рддрд╛ рд╣реИред рдЖрдЗрдП, рдПрдлрд╝рд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ:
 template<typename T> void anFill(An<T>& a) { throw std::runtime_error(std::string("Cannot find implementation for interface: ") + typeid(T).name()); } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг


рдЕрдм рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реИ:
 struct X { X() : counter(0) {} void action() { std::cout << ++ counter << ": in action" << std::endl; } int counter; }; 

рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ X рдХреЗ рд▓рд┐рдП рдПрдлрд╝рд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ:
 template<> void anFill<X>(An<X>& a) { static X x; a = &x; } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ (рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдореЗрдВ рдмрд╣реБрд╕реНрддрд░реАрдп рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА)ред рдЕрдм рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрдХреНрд╖рд╛ X рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 An<X> x; x->action(); 

рдпрд╛ рдЖрд╕рд╛рди:
 An<X>()->action(); 

рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛:
 1: in action 

рдЬрдм рдХрд╛рд░реНрд░рд╡рд╛рдИ рдлрд┐рд░ рд╕реЗ рдмреБрд▓рд╛рдИ рдЬрд╛рдПрдЧреА, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:
 2: in action 

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд░рд╛рдЬреНрдп рд╣реИ рдФрд░ рджрд╕рд╡реАрдВ рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╣реИред рдЕрдм рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ Y рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рджрд╕рд╡реАрдВ рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрдЧрд╛:
 struct Y { An<X> x; void doAction() { x->action(); } }; 

рдЕрдм рдпрджрд┐ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 Y y; y.doAction(); 

рдкрд┐рдЫрд▓реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛:
 3: in action 

рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдпрд╣ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:
 X x; yx = &x; y.doAction(); 

рдпрд╛рдиреА рд╣рдо рдЕрдкрдиреЗ (рдЬреНрдЮрд╛рдд) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ Y рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рдореЗрдВ:
 1: in action 

рдЕрдм рд╣рдо рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕рд╛рд░ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
 struct I { virtual ~I() {} virtual void action() = 0; }; 

рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 struct Impl1 : I { virtual void action() { std::cout << "in Impl1" << std::endl; } }; struct Impl2 : I { virtual void action() { std::cout << "in Impl2" << std::endl; } }; 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдо Impl1 рдХреЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЙрдкреБрд▓реЗрдЯ рдХрд░реЗрдВрдЧреЗ:
 template<> void anFill<I>(An<I>& a) { static Impl1 i; a = &i; } 

рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб:
 An<I> i; i->action(); 

рдирд┐рд╖реНрдХрд░реНрд╖ рджреЗрдЧрд╛:
 in Impl1 

рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:
 struct Z { An<I> i; void doAction() { i->action(); } }; 

рдЕрдм рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░реЗрдВ:
 Z z; Impl2 i; zi = &i; z.doAction(); 

рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк:
 in Impl2 


рд╡рд┐рдЪрд╛рд░ рд╡рд┐рдХрд╛рд╕


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдореИрдХреНрд░реЛрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ:
 #define PROTO_IFACE(D_iface) \ template<> void anFill<D_iface>(An<D_iface>& a) #define DECLARE_IMPL(D_iface) \ PROTO_IFACE(D_iface); #define BIND_TO_IMPL_SINGLE(D_iface, D_impl) \ PROTO_IFACE(D_iface) { a = &single<D_impl>(); } #define BIND_TO_SELF_SINGLE(D_impl) \ BIND_TO_IMPL_SINGLE(D_impl, D_impl) 

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

DECLARE_IMPL рдореИрдХреНрд░реЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрдбрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдкреИрдбрд┐рдВрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд░реЗрдЦрд╛ рдХрд╣рддреА рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рднрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ BIND_TO_IMPL_SINGLE рдХрд╛ рдЙрдкрдпреЛрдЧ CPP рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ:
 template<typename T> T& single() { static T t; return t; } 

рдореИрдХреНрд░реЛ BIND_TO_SELF_SINGLE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдореИрдХреНрд░реЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде BIND_TO_IMPL_SINGLE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ CPP рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЫрд┐рдкрд╛рдпрд╛ рдФрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди:
 // IConfiguration.hpp struct IConfiguration { virtual ~IConfiguration() {} virtual int getConnectionsLimit() = 0; virtual void setConnectionLimit(int limit) = 0; virtual std::string getUserName() = 0; virtual void setUserName(const std::string& name) = 0; }; DECLARE_IMPL(IConfiguration) // Configuration.cpp struct Configuration : IConfiguration { Configuration() : m_connectionLimit(0) {} virtual int getConnectionsLimit() { return m_connectionLimit; } virtual void setConnectionLimit(int limit) { m_connectionLimit = limit; } virtual std::string getUserName() { return m_userName; } virtual void setUserName(const std::string& name) { m_userName = name; } private: int m_connectionLimit; std::string m_userName; }; BIND_TO_IMPL_SINGLE(IConfiguration, Configuration); 

рдЖрдЧреЗ рдЗрд╕реЗ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 struct ConnectionManager { An<IConfiguration> conf; void connect() { if (m_connectionCount == conf->getConnectionsLimit()) throw std::runtime_error("Number of connections exceeds the limit"); ... } private: int m_connectionCount; }; 


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


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛:
  1. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛: рдЕрдм рдЖрдкрдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рджреЗрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд╡реЗ рд╕рднреА рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдпрд╣ рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
  2. рдПрдХ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рд░ рдХреЛрдИ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрд╕рдЖрд░рдкреА рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рд╣реЛрддрд╛ рд╣реИред
  3. рдпрджрд┐ рдХрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВ, рддреЛ рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдореИрдирдЬрд░ рд╡рд░реНрдЧ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╕рд╛рдиреА рд╕реЗ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред
  4. рдХреНрд▓рд╛рд╕ рдХреА рдЯреЗрд╕реНрдЯрд┐рдмрд┐рд▓рд┐рдЯреА: рдЖрдк рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХрдиреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд┐рддрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ:
     struct MockConfiguration : IConfiguration { virtual int getConnectionsLimit() { return 10; } virtual void setConnectionLimit(int limit) { throw std::runtime_error("not implemented in mock"); } virtual std::string getUserName() { throw std::runtime_error("not implemented in mock"); } virtual void setUserName(const std::string& name) { throw std::runtime_error("not implemented in mock"); } }; void test() { // preparing ConnectionManager manager; MockConfiguration mock; manager.conf = &mock; // testing try { manager.connect(); } catch(std::runtime_error& e) { //... } } 


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

рд╕рд╛рд╣рд┐рддреНрдп


[рез] рдЖрд░рдПрд╕рдбреАрдПрди рдлреЛрд░рдо: рд╕рд┐рдВрдЧрд▓рдЯрди рджреЛрд╖ рд╕реВрдЪреА
[реи] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛: рд╕рд┐рдВрдЧрд▓рдЯрди
[рей] рдЗрдирд╕рд╛рдЗрдб C ++: рд╕рд┐рдВрдЧрд▓рдЯрди

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


All Articles