16-ma’ruza. Obyektga yo’naltirilgan dasturlashda parametrlash. Amallarni qayta yuklash. Funksiya shablonlari va ulardan foydalanish



Yüklə 103,92 Kb.
səhifə7/7
tarix14.03.2023
ölçüsü103,92 Kb.
#87765
1   2   3   4   5   6   7
3.127-listing
class Dollars
{
private:
int m_dollars;
public:
Dollars(int dollars)
: m_dollars(dollars)
{
}
friend bool operator>(const Dollars &d1, const Dollars &d2)
{
return (d1.m_dollars > d2.m_dollars);
}
friend ostream& operator<< (ostream &out, const Dollars &dollars)
{
out << dollars.m_dollars << " dollars ";
return out;
}
};
Agar 3.127-listingdagi dastur kompilyatsiyadan oʻtkazilsa, quyidagi xatolarni koʻrish mumkin:
Ошибка C2676 бинарный "+=": "T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору2
Ошибка C2676 бинарный "/=": "T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору3
Ushbu xatolar average() funksiyasiga chaqiruv (Dollars *, int) tomonidan yaratilgan funksiya shablonining nusxasi tufayli yuzaga kelgan. Esda tutish lozimki, funksiya shablonini chaqirganda, kompilyator funksiya shablonini parametr turlari bilan koʻchiradi va keyin shablon parametrlari turlarini faktik (joʻnatilgan) ma’lumotlar turlari bilan almashtiradi. 3.128-listingda average() funksiya shablonining nusxasi keltirilgan, bu holatda – T Dollars sinfi hisoblanadi.
3.128-listing
template
Dollars average(Dollars *array, int length)
{
Dollars sum = 0;
for (int count=0; count < length; ++count)
sum += array[count];
sum /= length;
return sum;
}
Xato xabarini olinganing sababi quyidagi qatorda:
sum += array[count];
Bunday holda, sum Dollars sinfining obyekti hisoblanadi. Buning ishlashi uchun Dollars sinfi uchun += va /= operatorlarini qayta yuklashimiz kerak (3.129-listing)
3.129-listing
class Dollars
{
private:
int m_dollars;
public:
Dollars(int dollars)
: m_dollars(dollars)
{
}
friend bool operator>(const Dollars &d1, const Dollars &d2)
{
return (d1.m_dollars > d2.m_dollars);
}
friend ostream& operator<< (ostream &out, const Dollars &dollars)
{
out << dollars.m_dollars<< " dollars ";
return out;
}
Dollars& operator+=(Dollars dollars)
{
m_dollars += dollars.m_dollars;
return *this;
}
Dollars& operator/=(int value)
{
m_dollars /= value;
return *this;
}
};
Nihoyat, kod muvaffaqiyatli kompilyatsiya qilinadi va quyidagi natija chop etiladi:
13 dollar
Bajarilgan ish juda koʻp boʻlib tuyulishi mumkin boʻlsa-da, bu Dollar sinfi boshidanoq “teri va suyak” boʻlganligi uchundir. Bu holatda asosiy nuqta shundaki, Dollars sinfidagi obyektlar (yoki boshqa ma’lumotlar turi) bilan ishlash uchun average() funksiyasini oʻzgartirishimiz shart emas. Barcha ishlar faqat Dollars sinfi bilan amalga oshirildi, qolganlari bilan kompilyator shugʻullanadi.


1 C2676 ikkilik ">" xatosi: "const T" bu operatorni yoki oldindan aniqlangan operator uchun maqbul turga o’tkazishni aniqlamaydi

2 C2676 ikkilik xatosi '+=': 'T' bu operatorni yoki oldindan aniqlangan operator uchun maqbul turga o’tkazishni aniqlamaydi

3 C2676 ikkilik xatosi '/=': 'T' bu operatorni yoki oldindan aniqlangan operator uchun maqbul turga o’tkazishni aniqlamaydi

Yüklə 103,92 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin