SORU
28 AĞUSTOS 2014, PERŞEMBE


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
28 AĞUSTOS 2014, PERŞEMBE


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; };

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C++

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Christopher Bill

    Christopher

    30 NİSAN 2009
  • JorteexHD

    JorteexHD

    20 NİSAN 2012
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011