Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ программирования Π½Π° Π‘++. 101 ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ рСкомСндация». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€

ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Π½Π΅ трСбуСтся ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°. ПолноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса Π‘ трСбуСтся Π² Π΄Π²ΡƒΡ… основных случаях.

β€’ ΠšΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π‘. НапримСр, ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π‘ Π² стСкС ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ использовании Π΅Π³ΠΎ Π² качСствС нСпосрСдствСнно Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ (Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ) Ρ‡Π»Π΅Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса.

β€’ ΠšΠΎΠ³Π΄Π° Π²Π°ΠΌ трСбуСтся имя ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ‡Π»Π΅Π½Π° Π‘. НапримСр, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ этого класса.

НС Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π² этой ΠΊΠ½ΠΈΠ³Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ случаи цикличСских зависимостСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приводят ΠΊ ошибкам компиляции β€” Π΄ΡƒΠΌΠ°Π΅ΠΌ, Π²Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚Π΅ΡΡŒ с Π½ΠΈΠΌΠΈ, воспользовавшись ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌΠΈ совСтами, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π² Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 1. ΠœΡ‹ ΠΆΠ΅ обратимся ΠΊ цикличСским зависимостям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΈ посмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Π΅Π³ΠΎ качСство ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ дСйствия слСдуСт ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΈΡ….

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС зависимости ΠΈ ΠΈΡ… Ρ†ΠΈΠΊΠ»Ρ‹ слСдуСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ прСдставляСт собой ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΠΉ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π½Π°Π±ΠΎΡ€ совмСстно ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… классов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 5). ЦикличСская Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ Π²ΠΈΠ΄Π΅ прСдставляСт собой Π΄Π²Π° класса, нСпосрСдствСнно зависящих Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°

class Child; // УстранСниС цикличСской зависимости


class Parent { // ...

 Child* myChild_;

};


// Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅

class Child { // ...

 Parent* myParent_;

};

ΠšΠ»Π°ΡΡΡ‹ Parent ΠΈ Child зависят Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ компилируСтся, Π½ΠΎ ΠΌΡ‹ сталкиваСмся с Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ: эти Π΄Π²Π° класса большС Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСзависимыми, ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, становятся взаимозависимы Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Π­Ρ‚ΠΎ Π½Π΅ всСгда ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ мСсто лишь Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π° класса ΡΠ²Π»ΡΡŽΡ‚ΡΡ частями ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ модуля (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, оттСстированного ΠΈ Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅).

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ описанной ситуации, рассмотрим, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли класс Child Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Parent? Π’ΠΎΠ³Π΄Π° Child ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ Π² собствСнном ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ нСбольшом ΠΌΠΎΠ΄ΡƒΠ»Π΅ (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ), ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимо ΠΎΡ‚ Parent β€” Ρ‡Ρ‚ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, сущСствСнно ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ проСктирования.

ВсС становится Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° зависимости ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ нСсколько ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π’Π°ΠΊΠΎΠΉ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ "ΠΊΠ»Π΅ΠΉ", ΠΊΠ°ΠΊ зависимости, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ эти модуля Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½ΡƒΡŽ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ†ΠΈΠΊΠ»Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ самыми ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹ΠΌΠΈ Π²Ρ€Π°Π³Π°ΠΌΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΡ€Π²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»Ρ‹, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (Dependency Inversion Principle), описанный Π² [Martin96a] ΠΈ [Martin00] (см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 36): Π½Π΅ Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ высокого уровня зависящими ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня; вмСсто этого Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΠΈΡ… зависимыми ΠΎΡ‚ абстракций. Если Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСзависимыС абстрактныС классы для Parent ΠΈΠ»ΠΈ Child, Π²Ρ‹ Ρ€Π°Π·ΠΎΡ€Π²Π΅Ρ‚Π΅ Ρ†ΠΈΠΊΠ». Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… частями ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ модуля.

Частный Π²ΠΈΠ΄ зависимости, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡ‚Ρ€Π°Π΄Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, β€” это транзитивная Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов, которая осущСствляСтся, ΠΊΠΎΠ³Π΄Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс зависит ΠΎΡ‚ всСх своих наслСдников, прямых ΠΈ нСпрямых. Ряд Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ шаблона проСктирования Visitor приводят ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ зависимости, которая допустима Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… иСрархиях. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, воспользовавшись шаблоном проСктирования Acyclic Visitor [Martin98].

Одним ΠΈΠ· симптомов Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½Ρ‹Ρ… зависимостСй являСтся пСрСкомпиляция Π±ΠΎΠ»ΡŒΡˆΠΈΡ… частСй ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈ внСсСнии Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 2).

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ЦикличСскиС зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ классами β€” Π½Π΅ всСгда ΠΏΠ»ΠΎΡ…ΠΎ, ΠΏΠΎΠΊΠ° классы Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ модуля ΠΈ совмСстно Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π²Ρ‹ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ. ΠŸΡ€ΠΎΡΡ‚Π°Ρ нСпосрСдствСнная рСализация Ρ‚Π°ΠΊΠΈΡ… шаблонов проСктирования, ΠΊΠ°ΠΊ Command ΠΈ Visitor приводят ΠΊ интСрфСйсам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ взаимозависимыми. Π’Π°ΠΊΠΈΠ΅ зависимости ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ, Π½ΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΎΠ³ΠΎ проСктирования.

Бсылки

[Alexandrescu01] Β§3 β€’ [Boost] β€’ [Gamma95] β€’ [Lakos96] Β§0.2.1, Β§4.6-14, Β§5 β€’ [Martin96a] β€’ [Martin96b] β€’ [Martin98] Β§7 β€’ [Martin00] β€’ [McConnell93] Β§5 β€’ [Meyers97] Β§46 β€’ [Stroustrup00] Β§24.3.5 β€’ [Sutter00] Β§26 β€’ [Sutter02] Β§37 β€’ [Sutter03]

23. Π”Π΅Π»Π°ΠΉΡ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ самодостаточными

РСзюмС

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ написанный Π²Π°ΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚.Π΅. Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависит Π΅Π³ΠΎ содСрТимоС.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Если ΠΎΠ΄ΠΈΠ½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ получаСтся ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠΈΠΌ, Π° Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ возлагаСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π° ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π°Π΄ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² исходный тСкст.

РаньшС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ экспСрты совСтовали, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ·-Π·Π° Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ прСпроцСссоров ΠΎΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, сСйчас этот совСт устарСл. МногиС соврСмСнныС компиляторы Π‘++ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² автоматичСски (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 24) ΠΈ просто Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄Π²Π°ΠΆΠ΄Ρ‹. НСкоторыС компиляторы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², которая позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

Однако Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ Π½Π΅ Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅ΡΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это напрасно создаСт ΠΏΠ°Ρ€Π°Π·ΠΈΡ‚Π½Ρ‹Π΅ зависимости.

Для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ самодостаточности Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² скомпилируйтС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкам ΠΈΠ»ΠΈ прСдупрСТдСниям.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Ряд Ρ‚ΠΎΠ½ΠΊΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² связи с использованиСм шаблонов.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ЗависимыС ΠΈΠΌΠ΅Π½Π°. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, с Ρ‚Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ всС зависимыС ΠΈΠΌΠ΅Π½Π° ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ инстанцирования. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ template<class T> class Widget с Ρ‡Π»Π΅Π½ΠΎΠΌ std::deque<T> Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, Π΄Π°ΠΆΠ΅ Ссли Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <deque> Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ β€” Ссли ΠΏΡ€ΠΈ этом Π½Π΅ происходит инстанцированиС Widget. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ шаблон Widget сущСствуСт для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ инстанцированным, Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ строку #include <deque>.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ шаблонов ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ использовании. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Widget Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½Π° Ρ‚ΠΈΠΏΠ° std::deque<T>, Π½ΠΎ функция-Ρ‡Π»Π΅Π½ Widget с ΠΈΠΌΠ΅Π½Π΅ΠΌ Transmogrify ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ deque. Π’ΠΎΠ³Π΄Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Widget функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Widget, Π΄Π°ΠΆΠ΅ Ссли Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <deque> Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ β€” Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция-Ρ‡Π»Π΅Π½ Transmogrify. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Widget всС ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ <deque>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Widget. Π’ Ρ€Π΅Π΄ΠΊΠΈΡ… случаях, ΠΊΠΎΠ³Π΄Π° большой Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для обСспСчСния работоспособности Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ шаблона, слСдуСт ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ ΠΈ вынСсти ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ упомянутый большой Ρ„Π°ΠΉΠ» (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 44).

Бсылки

[Lakos96] Β§3.2 β€’ [Stroustrup00] Β§9.2.3 β€’ [Sutter00] Β§26-30 β€’ [Vandevoorde03] Β§9-10

24. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ, Π½ΠΎ Π½Π΅ внСшнюю Π·Π°Ρ‰ΠΈΡ‚Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include

РСзюмС

ΠŸΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ мноТСствСнноС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Π°ΡˆΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #include, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π² Π½ΠΈΡ… Π·Π°Ρ‰ΠΈΡ‚Ρƒ с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ пСрСопрСдСлСния Π² случаС мноТСствСнного Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. НапримСр, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» fΠΎΠΎ.h Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄:

#ifndef FOO_H_INCLUDED_

#define FOO_H_INCLUDED_

// ... Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° …

#endif

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

β€’ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΈΠΌΠ΅Π½Π°, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… вашСго прилоТСния. Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ использовали ΠΎΠ΄Π½ΠΎ распространСнноС соглашСниС для ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π·Π°Ρ‰ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Π½; ΠΈΠΌΠ΅Π½Π° для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ имя прилоТСния, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ инструмСнты Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° для Π·Π°Ρ‰ΠΈΡ‚Ρ‹, содСрТащиС случайныС числа.

β€’ НС ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Ρ…ΠΈΡ‚Ρ€ΠΈΡ‚ΡŒ. НС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π΄ΠΎ ΠΈ послС Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ части, ΠΈ слСдуйтС ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ стандартной Ρ„ΠΎΡ€ΠΌΠ΅ Π·Π°Ρ‰ΠΈΡ‚Ρ‹. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ прСпроцСссоры ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΌΠ°Π»ΠΎΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ строго Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².