Do'stlar sinfi - Friend class

A do'st sinf yilda C ++ ga kirishi mumkin xususiy va himoyalangan a'zolari sinf unda u do'st deb e'lon qilinadi.[1] Do'st sinfidan muhim foydalanish, bu ma'lumotlar strukturasini ifodalovchi asosiy sinfga kirishni ta'minlash uchun sinf tomonidan ifodalangan ma'lumotlar strukturasining bir qismidir. Friend class mexanizmi ma'lumotlar tuzilmasi foydalanuvchilari ko'rganidek to'g'ri kapsulyatsiyani saqlab, qismlarni saqlash va ularga kirishni kengaytirishga imkon beradi.

Do'stlar sinfiga o'xshash, a do'st funktsiyasi a funktsiya u do'st deb e'lon qilingan sinfning shaxsiy va himoyalangan a'zolariga kirish huquqini beradi.

Misol

Quyidagi misol grafik ma'lumotlar tuzilishi uchun do'st-sinfdan foydalanishni namoyish etadi, bu erda grafik asosiy Graph klassi bilan, grafaning tepalari esa Vertex klassi bilan ifodalanadi.

# shu jumladan <iostream># shu jumladan <memory># shu jumladan <string># shu jumladan <unordered_set>sinf Grafik;sinf Tepalik { jamoat:  aniq Tepalik(std::mag'lubiyat ism) : chekka_(), ism_(std::harakat qilish(ism)) {}  avtomatik boshlash() konst { qaytish chekka_.boshlang(); }  avtomatik oxiri() konst { qaytish chekka_.bekor qilish(); }  konst avtomatik& ism() konst { qaytish ism_; } xususiy:  // Vertex Graph-ga kirish huquqini beradi.  do'stim sinf Grafik;  std::tartibsiz_set<Tepalik*> chekka_;  std::mag'lubiyat ism_;};sinf Grafik { jamoat:  ~Grafik() {    esa (!nilufar.bo'sh()) {      avtomatik tepalik = nilufar.boshlash();      RemoveVertex(*tepalik);    }  }  avtomatik AddVertex(konst std::mag'lubiyat& ism) -> Tepalik* {    avtomatik tepalik = std::make_unique<Tepalik>(ism);    avtomatik iter = abdullaev.kiritmoq(tepalik.olish());    qaytish tepalik.ozod qilish();  }  bekor RemoveVertex(Tepalik* tepalik) {    abdullaev.o'chirish(tepalik);    o'chirish tepalik;  }  avtomatik AddEdge(Tepalik* dan, Tepalik* ga) {    // Grafik Vertex-ning shaxsiy maydonlariga kira oladi, chunki Vertex Graph-ni shunday deb e'lon qildi    // do'st.    dan->chekka_.kiritmoq(ga);  }  avtomatik boshlash() konst { qaytish abdullaev.boshlang(); }  avtomatik oxiri() konst { qaytish abdullaev.bekor qilish(); } xususiy:  std::tartibsiz_set<Tepalik*> abdullaev;};

Kapsülleme

Do'st-sinflardan to'g'ri foydalanish inkapsulyatsiyani kuchaytiradi, chunki bu ma'lumotlar tuzilmasining shaxsiy kirishini uning qismlariga --- ma'lumotlar tuzilmasi egalik qiladigan --- boshqa tashqi sinflarga shaxsiy kirish huquqini bermasdan kengaytirish imkoniyatini beradi. Shunday qilib, ma'lumotlar tuzilmasi ma'lumotlar strukturasining invariantlarini tashqi tomondan buzish uchun tasodifiy urinishlardan himoyalangan bo'lib qoladi.

Shuni ta'kidlash kerakki, sinf boshqa sinfning shaxsiy qismiga kirish huquqini bera olmaydi; bu kapsulani buzadi. Aksincha, sinf o'z shaxsiy qismlariga boshqa sinfga kirish huquqini beradi --- bu sinfni do'st deb e'lon qilish orqali. Grafik misolida Graph o'zini Vertex do'sti deb e'lon qila olmaydi. Aksincha, Vertex Grafni do'sti deb e'lon qiladi va shuning uchun Grafga shaxsiy maydonlariga kirish huquqini beradi.

Sinf o'z do'stlarini tanlashi, do'stlikning umuman nosimmetrik emasligini anglatadi. Grafik misolida Vertex Graphning shaxsiy maydonlariga kira olmaydi, garchi Graph vertexning shaxsiy maydonlariga kira olsa.

Shu bilan bir qatorda

Shunga o'xshash, lekin unga teng bo'lmagan til xususiyati C # ning ichki kalit so'zi bilan berilgan, bu bir xil assambleyadagi sinflarga boshqa sinflarning shaxsiy qismlariga kirish imkoniyatini beradi. Bu har bir sinfni o'sha assambleyada boshqasining do'sti sifatida belgilashga to'g'ri keladi; do'stlar sinflari yanada nozikroq.

Do'st sinflarini qo'llab-quvvatlamaydigan dasturlash tillari yoki shunga o'xshash til xususiyati ma'lumotlar tuzilmasida xavfsiz qismlarga asoslangan interfeysga erishish uchun vaqtinchalik echimlarni amalga oshirishi kerak. Bunday vaqtinchalik echimlarga misollar:

  • Qismlarning maydonlarini hammaga ochiq qiling. Ushbu yechim ma'lumotlar strukturasining invariantlarini tashqi tomondan buzish imkoniyatini yaratib, kapsulani kamaytiradi.
  • Barcha o'zgaruvchan tizimli ma'lumotlarni qismdan ma'lumotlar tuzilmasiga o'tkazing va har bir qismdan ma'lumotlar tuzilmasiga bilvosita kiriting. Ushbu echim ma'lumotlar strukturasining tashkil etilishini o'zgartiradi va boshqa hollarda bu ma'lumotlarga ehtiyoj qolmaydigan hollarda xotira sarfini oshiradi.

Xususiyatlari

  • Do'stlik emas nosimmetrik - agar sinf bo'lsa A sinf do'sti B, sinf B avtomatik ravishda sinf do'sti emas A.
  • Do'stlik emas o'tish davri - agar sinf bo'lsa A sinf do'sti Bva sinf B sinf do'sti C, sinf A avtomatik ravishda sinf do'sti emas C.
  • Do'stlik emas meros qilib olingan - agar sinf bo'lsa Asosiy sinf do'sti X, subklass Olingan avtomatik ravishda sinf do'sti emas X; va agar sinf bo'lsa X sinf do'sti Asosiy, sinf X avtomatik ravishda subklassning do'sti emas Olingan. Ammo, agar sinf bo'lsa Y subklassning do'sti Olingan, sinf Y shuningdek, sinfning himoyalangan qismlariga kirish huquqiga ega bo'ladi Asosiy, xuddi subklass kabi Olingan qiladi.

Shuningdek qarang

Adabiyotlar

Tashqi havolalar