එයට හේතුව වෙනම සම්පාදනයක අවශ්යතාවය සහ සැකිලි ක්ෂණික ශෛලීය බහුමාපකය වන බැවිනි.
පැහැදිලි කිරීමක් සඳහා කොන්ක්රීට් වලට ටිකක් සමීප වීමට ඉඩ දෙමු. මට පහත ලිපිගොනු ඇති බව පවසන්න:
- foo.h
- හි අතුරු මුහුණත ප්රකාශ කරයි
class MyClass<T>
- foo.cpp
- ක්රියාත්මක කිරීම අර්ථ දක්වයි
class MyClass<T>
- bar.cpp
මම සම්පාදනය කිරීමට හැකි විය යුතුය වෙනම සම්පාදනය කිරිමේ ක්රම foo.cpp ස්වාධීනව සිට bar.cpp . එක් එක් සම්පාදන ඒකකයේ විශ්ලේෂණය, ප්රශස්තිකරණය සහ කේත උත්පාදනය යන සියලු වෙහෙස මහන්සි වී සම්පාදකයා සම්පූර්ණයෙන්ම ස්වාධීනව කරයි; අපට සම්පූර්ණ වැඩසටහන් විශ්ලේෂණය කිරීමට අවශ්ය නැත. මුළු වැඩසටහනම එකවර හැසිරවිය යුත්තේ සම්බන්ධකය පමණි, සහ සම්බන්ධකයේ කාර්යය සැලකිය යුතු ලෙස පහසුය.
bar.cpp පවා මම බැදීමකට පවතී කිරීම අවශ්ය නොවේ foo.cpp , නමුත් මම තවමත් සම්බන්ධ කිරීමට හැකි විය යුතුය foo.o මම දැනටමත් සමග එකට සිටි bar.o recompile වෙත යාමකින් තොරව, මම යන්තම් ඉදිරිපත් තියෙනවා foo .cpp . foo.cpp ගතික පුස්තකාලයකට සම්පාදනය කර, foo.cpp නොමැතිව වෙනත් තැනකට බෙදා හැරිය හැකි අතර , මම foo.cpp ලිවීමෙන් වසර ගණනාවකට පසු ඔවුන් ලියන කේත සමඟ සම්බන්ධ කළ හැකිය .
"Instantiation-style polymorphism" යන්නෙන් අදහස් කරන්නේ අච්චුව MyClass<T>
යනු ඕනෑම වටිනාකමක් සඳහා ක්රියා කළ හැකි කේතයකට සම්පාදනය කළ හැකි සාමාන්ය පන්තියක් නොවන බවයි T
. බව C ++ සැකිලි මෙහි අරමුණ කට ආසන්න සමාන ලිවීමට ඇති නොගැනීමයි ආදිය විබෙදන්නෙක්ට හා ඉදිකිරීම් කර්මාන්තකරුවාගේ කටයුතු කිරීමට සූචක සම්මත කිරීමට අවශ්ය බොක්සිං, වැනි පොදුකාර්ය පිරිවැය එකතු වනු ඇත class MyClass_int
, class MyClass_float
ආදිය, නමුත් තවමත් බව සම්පාදනය කේතය සමඟ අවසන් කිරීමට හැකි විය අපි නම් බොහෝ ලෙස තිබේ , ෙවන් ෙවන් වශෙයන් සෑම අනුවාදය ලියා. එබැවින් අච්චුවක් වචනාර්ථයෙන් අච්චුවකි; පන්ති අච්චුවක් පන්තියක් නොවේ , එය T
අපට හමු වන සෑම කෙනෙකුටම නව පන්තියක් නිර්මාණය කිරීම සඳහා වූ වට්ටෝරුවකි . අච්චුවක් කේතයට සම්පාදනය කළ නොහැක, අච්චුව ස්ථාපනය කිරීමේ ප්රති result ලය පමණක් සම්පාදනය කළ හැකිය.
එබැවින් foo.cpp සම්පාදනය කළ විට , එය අවශ්ය බව දැන ගැනීමට සම්පාදකයාට bar.cpp නොපෙනේMyClass<int>
. එයට අච්චුව දැකිය හැකිය MyClass<T>
, නමුත් ඒ සඳහා කේත විමෝචනය කළ නොහැක (එය අච්චුවක් මිස පන්තියක් නොවේ). Bar.cpp සම්පාදනය කළ විට , එය නිර්මාණය කිරීමට අවශ්ය බව සම්පාදකයාට දැකිය හැකිය MyClass<int>
, නමුත් එයට අච්චුව දැකිය නොහැක MyClass<T>
( foo.h හි එහි අතුරු මුහුණත පමණි ) එබැවින් එය නිර්මාණය කළ නොහැක.
Foo.cpp විසින්ම භාවිතා කරන්නේ නම්, foo.cppMyClass<int>
සම්පාදනය කිරීමේදී ඒ සඳහා කේතය ජනනය වනු ඇත , එබැවින් bar.o foo.o සමඟ සම්බන්ධ වූ විට ඒවා සම්බන්ධ කර ක්රියා කළ හැකිය. තනි අච්චුවක් ලිවීමෙන් .cpp ගොනුවක් තුළ සීමිත අච්චු සැකසුම් මාලාවක් ක්රියාත්මක කිරීමට ඉඩ දීම සඳහා අපට එම කරුණ භාවිතා කළ හැකිය. නමුත් අච්චුව අච්චුවක් ලෙස භාවිතා කිරීමට හා එය කැමති ඕනෑම වර්ගයක ක්ෂණිකව ස්ථාපනය කිරීමට bar.cpp ට ක්රමයක් නොමැත ; එයට භාවිතා කළ හැක්කේ foo.cpp හි කතුවරයා සැපයීමට සිතූ සැකසූ පන්තියේ පෙර පැවති අනුවාදයන් පමණි .
අච්චුවක් සම්පාදනය කිරීමේදී සම්පාදකයා "සියලු සංස්කරණ ජනනය කළ යුතුය", කිසි විටෙකත් භාවිතා නොකරන ඒවා සම්බන්ධ කිරීමේදී පෙරහන් නොකෙරේ යැයි ඔබට සිතෙනු ඇත. විශාල පොදු පිරිවැය සහ එවැනි ප්රවේශයකට මුහුණ දීමට සිදුවන දුෂ්කරතා හැරුණු විට, දර්ශක සහ අරා වැනි “ටයිප් මෝඩිෆයර්” විශේෂාංග මඟින් ගොඩනඟන ලද වර්ගවලට පවා අසීමිත වර්ග ගණනක් බිහි කිරීමට ඉඩ සලසයි, මම දැන් මගේ වැඩසටහන දීර් when කරන විට කුමක් සිදුවේද? එකතු කිරීමෙන්:
- baz.cpp
- ප්රකාශ කිරීම සහ ක්රියාත්මක කිරීම
class BazPrivate
සහ භාවිතා කිරීමMyClass<BazPrivate>
අප හෝ හැර මෙය ක්රියාත්මක විය හැකි ක්රමයක් නොමැත
- වැඩසටහනේ වෙනත් ඕනෑම ගොනුවක් වෙනස් කරන සෑම අවස්ථාවකම foo.cpp නැවත සකස් කළ යුතුය .
MyClass<T>
- බව අවශ්ය baz.cpp පූර්ණ ආකෘතියකි (ශීර්ෂක ඇතුලත් හරහා හැකි)
MyClass<T>
සම්පාදකවරයා ජනනය කළ හැකි නිසා බව, MyClass<BazPrivate>
එම් සම්පාදනය තුළ baz.cpp .
කිසිවෙකු කැමති නැත (1), මන්දයත් සමස්ත වැඩසටහන්-විශ්ලේෂණ සම්පාදක පද්ධති සම්පාදනය කිරීමට සදහටම ගත වන නිසාත්, ප්රභව කේත නොමැතිව සම්පාදිත පුස්තකාල බෙදා හැරීමට නොහැකි නිසාත් ය. ඒ නිසා අපට ඒ වෙනුවට (2) ඇත.