1-ma’ruza C++ da Sinflar va obyektlar. Konstruktor va destruktor. Sinf usullari reja


unresolved external symbol "public: int __thiscall Array::getLength(void)" (?GetLength@?$Array@H@@QAEHXZ)


Download 86.61 Kb.
bet16/23
Sana09.06.2023
Hajmi86.61 Kb.
#1472539
1   ...   12   13   14   15   16   17   18   19   ...   23
Bog'liq
Algoritmlashga kirish fanidan majmua

unresolved external symbol "public: int __thiscall Array::getLength(void)" (?GetLength@?$Array@H@@QAEHXZ)
Shablondan foydalanish uchun kompilyator shablon ta'rifini (faqat deklaratsiyani emas) va shablonni yaratish uchun ishlatiladigan shablon turini ko'rishi kerak . Esda tutingki, C++ fayllarni alohida kompilyatsiya qiladi. Array.h sarlavha fayli main.cpp ichiga kiritilganda, sinf shablonining ta'rifi ushbu faylga ko'chiriladi. main.cpp da kompilyator bizga sinf shablonining ikkita nusxasi kerakligini ko'radi: Array va Array, ularni yaratadi va keyin barcha ushbu kodni main.cpp faylining bir qismi sifatida kompilyatsiya qiladi. Biroq, Array.cpp (alohida fayl sifatida) kompilyatsiyasi haqida gap ketganda, kompilyator biz foydalangan Array va qilganimizni unutadi. Array main.cpp ichida va dasturni bajarishimiz kerak bo'lgan getLength() funksiyasi shablonini yaratmaydi. Array::getLength() Biz bog'lovchi xatosini olamiz, chunki kompilyator ikkalasining ham ta'rifini topa olmaydi Array.cpp'>Array::getLength().
Bu muammoni bir necha usul bilan hal qilish mumkin.
Eng oson variant Array.cpp kodini sinf ostida Array.h da qo'yishdir. Shunday qilib, biz Array.h ni kiritganimizda, barcha sinf shablonlari kodi (sinf va uning usullarining to'liq deklaratsiyasi va ta'rifi) bir joyda bo'ladi. Ushbu usulning afzalligi uning soddaligi. Minus - agar sinf shablonlari ko'p joylarda ishlatilsa, biz sinf shablonining ko'plab mahalliy nusxalarini olamiz, bu esa kompilyatsiya vaqtini va fayllarni bog'lashni oshiradi (bog'lovchi sinf ta'riflari va usullarining takrorlanishini olib tashlashi kerak bo'ladi, shunda bajariladigan fayl paydo bo'ladi. fayl "juda shishgan" emas). Kompilyatsiya yoki bog'lanish vaqti muammo bo'lmasa, ushbu yechimdan foydalanish tavsiya etiladi.
Agar Array.cpp dan kodni Array.h ga qo‘yish Array.h ni juda katta/tartibsiz qiladi deb hisoblasangiz, alternativa Array.cpp nomini Array.inl ( inglizcha “ inl ine ” = “inline” dan .inl ) ga o‘zgartirishdir. " ) va keyin Array.h faylining pastki qismidan Array.inl ni ulash. Bu barcha kodni sarlavha fayliga qo'yish bilan bir xil natija beradi, lekin kodni biroz toza qiladi.
Yana bir yechim bor - .cpp fayllarini o'z ichiga oladi, lekin #include direktivasi nostandart foydalanish tufayli bu variant tavsiya etilmaydi.
Yana bir variant - uchta fayl yondashuvidan foydalanish :

Sinf shablonining ta'rifi sarlavha faylida saqlanadi.
Sinf shablonlari usuli ta'riflari alohida .cpp faylida saqlanadi.
Keyin biz uchinchi faylni qo'shamiz, unda bizga kerak bo'lgan sinf shablonining barcha namunalari mavjud.
Misol uchun templates.cpp:
// Shunday qilib, kompilyator Array sinfi shablonining to'liq ta'rifini ko'rishini ta'minlaymiz
#include "Array.h"
#include "Array.cpp"
// Bu yerda sizga kerak bo'lgan andoza ta'riflari bilan boshqa .h va .cpp fayllarni kiritasiz
// Bu yerda sizga kerak bo'lgan andoza ta'riflari bilan boshqa .h va .cpp fayllarni kiritasiz
template class Array; // sinf shablonining namunasini aniq yarating Array
template class Array; // sinf shablonining namunasini aniq yarating Array
// Bu yerda siz aniq o'zingizga kerak bo'lgan andozalarning boshqa nusxalarini yaratasiz.
Qism template classkompilyatorni sinf shablonining belgilangan namunalarini aniq yaratishiga olib keladi. Yuqoridagi misolda kompilyator templates.cpp faylini Array yaratadi. Array templates.cpp bizning loyihamiz ichida bo'lgani uchun u kompilyatsiya qiladi va boshqa fayllar bilan muvaffaqiyatli bog'lanadi (bog'lanish o'tadi).
Bu usul samaraliroq, lekin har bir dasturingiz (loyihangiz) uchun uchinchi faylni (templates.cpp) yaratish/saqlashni talab qiladi.

Download 86.61 Kb.

Do'stlaringiz bilan baham:
1   ...   12   13   14   15   16   17   18   19   ...   23




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling