Namespace (nomlar maydoni)


Download 31.99 Kb.
bet3/4
Sana17.06.2023
Hajmi31.99 Kb.
#1523755
1   2   3   4
Ichki nom maydonlari
Nomlar bo'shliqlari o'rnatilgan bo'lishi mumkin. Quyidagi misolda ko'rsatilganidek, oddiy ichki o'rnatilgan nom maydoni o'zining ota-ona a'zolariga malakasiz kirish huquqiga ega, lekin ota-ona a'zolari ichki o'rnatilgan nomlar maydoniga (agar u inline sifatida e'lon qilinmasa) malakasiz kirish huquqiga ega emas:
namespace ContosoDataServer
{
void Foo();


namespace Details
{
int CountImpl;
void Ban() { return Foo(); }
}


int Bar(){...};
int Baz(int i) { return Details::CountImpl; }
}


Oddiy ichki o'rnatilgan nomlar bo'shliqlari ota-ona nomlar maydonining umumiy interfeysining bir qismi bo'lmagan ichki amalga oshirish tafsilotlarini qamrab olish uchun ishlatilishi mumkin.


Inline nom maydonlari (C++ 11)
Oddiy ichki nom maydonidan farqli o'laroq, ichki nomlar maydonining a'zolari ota-ona nom maydonining a'zolari sifatida ko'rib chiqiladi. Bu xususiyat haddan tashqari yuklangan funksiyalarni argumentga bog‘liq holda qidirishni ota-ona va ichki o‘rnatilgan nomlar maydonida ortiqcha yuklangan funksiyalar ustida ishlash imkonini beradi. Shuningdek, u inline nomlar maydonida e'lon qilingan shablon uchun ota-ona nom maydonida ixtisoslashuvni e'lon qilish imkonini beradi. Quyidagi misol tashqi kodning sukut bo'yicha ichki nom maydoniga qanday bog'lanishini ko'rsatadi:
//Header.h
#include


namespace Test
{
namespace old_ns
{
std::string Func() { return std::string("Hello from old"); }
}


inline namespace new_ns
{
std::string Func() { return std::string("Hello from new"); }
}
}


#include "header.h"
#include
#include


int main()
{
using namespace Test;
using namespace std;


string s = Func();
std::cout << s << std::endl; // "Hello from new"
return 0;
}

Quyidagi misol ichki nomlar maydonida e'lon qilingan shablonning ota-onasida ixtisoslikni qanday e'lon qilishingiz mumkinligini ko'rsatadi:


C++Nusxalash
namespace Parent
{
inline namespace new_ns
{
template
struct C
{
T member;
};
}
template<>
class C {};
}
Kutubxonaning umumiy interfeysidagi o'zgarishlarni boshqarish uchun versiya mexanizmi sifatida inline nom maydonlaridan foydalanishingiz mumkin. Masalan, siz bitta ota-ona nom maydonini yaratishingiz va interfeysning har bir versiyasini ota-ona ichiga joylashtirilgan o'z nom maydoniga joylashtirishingiz mumkin. Eng so'nggi yoki afzal qilingan versiyani o'z ichiga olgan nom maydoni inline sifatida tasniflanadi va shuning uchun u ota-ona nom maydonining bevosita a'zosi kabi ko'rsatiladi. Parent::Classni chaqiruvchi mijoz kodi avtomatik ravishda yangi kodga ulanadi. Eski versiyadan foydalanishni ma'qul ko'rgan mijozlar ushbu kodga ega bo'lgan ichki nomlar maydoniga to'liq malakali yo'ldan foydalangan holda unga kirishlari mumkin.
Inline kalit so'zi kompilyatsiya birligidagi nomlar maydonining birinchi deklaratsiyasiga qo'llanilishi kerak.
Quyidagi misol interfeysning ikkita versiyasini ko'rsatadi, ularning har biri ichki nomlar maydonida. Nomlar maydoni interfeysdan v_20ba'zi o'zgarishlarga ega v_10va inline sifatida belgilangan. Yangi kutubxona va qo'ng'iroqlardan foydalanadigan mijoz kodi Contoso::Funcs::Addv_20 versiyasini ishga tushiradi. Qo'ng'iroq qilishga urinayotgan kod Contoso::Funcs::Divideendi kompilyatsiya vaqtida xatolikni oladi. Agar ularga haqiqatan ham ushbu funktsiya kerak bo'lsa, ular v_10aniq qo'ng'iroq qilish orqali versiyaga kirishlari mumkin Contoso::v_10::Funcs::Divide.
namespace Contoso
{
namespace v_10
{
template
class Funcs
{
public:
Funcs(void);
T Add(T a, T b);
T Subtract(T a, T b);
T Multiply(T a, T b);
T Divide(T a, T b);
};
}


inline namespace v_20
{
template
class Funcs
{
public:
Funcs(void);
T Add(T a, T b);
T Subtract(T a, T b);
T Multiply(T a, T b);
std::vector Log(double);
T Accumulate(std::vector nums);
};
}
}

Download 31.99 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




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