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

  • David MeShow

    David MeShow

    10 EKİM 2006
  • RocketJump

    RocketJump

    22 ŞUBAT 2006
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008