Neden sınıf adı enjekte edilir?C ::
Son zamanlarda, garip C bir özellik gördümenjekte sınıf adı.
class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
Ama bu özellik neden gerekli olduğunu çözemedim bir türlü. Bu özellik gerektiren herhangi bir uygulama var mı?
Ve bu özellik eski C " de yoktu duydum . , Ne zaman kullanılmaya başlandı? C 03? C 11?
CEVAP
Bu enjekte sınıf adı demektir X
sınıfın bir üyesi olarak X
, Bu yüzden bu ismi arama içinde X
her zaman bulur mevcut sınıf, başka bir X
olabilir ilan aynı kapsayan kapsamı, örneğin
void X() { }
class X {
public:
static X create() { return X(); }
};
create()
işlevi X
geçici bir nesne oluşturmak ya da işlevi X
arıyor? At isimlendirme alanı olur çağrı işlevi, yani amaç enjekte-sınıf-ismi sağlanması içinde vücudun X
adı her zaman bulur sınıfın kendisi (çünkü adı arama başlatılır sınıfın kendi kapsamı önce aramanın kapsayan kapsamı).
Bu da yararlı içinde sınıf şablonları, nereye enjekte sınıf adı kullanılır olmadan bir şablon argüman listesini, örneğin kullanarak sadece Foo
yerine tam şablon kimliği Foo<blah, blah, blah>
, Bu kadar kolay ifade etmek için geçerli bir örnekleme. Bu açıklık ve C 03 C 98 arasında değiştirmek için DR 176 bkz.
Enjekte sınıf adı fikri C 03 C 98, ama terminoloji yeni olduğu saptandı.
C 98 diyor ki:
Birsınıf-adıhangi hemen sonra . ilan kapsamı içine ^em>sınıf-adıolduğunu gördüm. Sınıf-adı da sınıfın kendisi kapsamına eklenir.
İkinci cümle DR 147 tarafından değiştirildi C 03 [Sınıf]/2 diyor ki:
Birsınıf-adıhangi hemen sonra . ilan kapsamı içine ^em>sınıf-adıolduğunu gördüm.sınıf-adıayrıca sınıfının kendi kapsamı içine; bu olarak bilinirenjekte sınıf-adı.
C 98, KOL sınıfı' adı her zaman sınıf beden sınıfının kendisini ifade etmek için kullanılabilir: . anlamına gelir kabaca eşdeğer bir ifade bile önce
Bir sınıf adı olarak kullanılabilirsınıf-adıhatta içindeüye listesisınıf belirleyicisi kendisi.
- Örneğin,
class link { link* next; };
Neden numaralama sınıf düz numaralama ...
Neden char[] şifreler için Dize Java t...
Neden Java Vector sınıfı eski veya kul...
Neden Java statik olarak bir sınıf bil...
Neden Java bize bir isim dosya adından...