SORU
26 Kasım 2014, ÇARŞAMBA


Nesne adını tekrar ederek statik bir yöntem arıyorum

Bir tek bende var:

struct foo {
  static foo& instance() {
    static foo f;
    return f;
  }
};

Yeniden düzenlenmesi bu açıklama ile sona erdi bazı kod "hata":

foo::foo::instance()

Ama bu doğru benim derleyici (gcc 4.7) tarafından kabul edilir. Hatta foo::foo::foo::instance() derler. Neden?

CEVAP
26 Kasım 2014, ÇARŞAMBA


Bu nedeniyle "enjekte adı" - Yani eğer foo a sınıfı-adı ve aynı adı "foo" da enjekte sınıf-kapsam bu yüzden kodunuzu çalışır. 100% Standart-uyumlu.

İşte bu özelliğin yararlarını gösteren ilginç bir örnek:

namespace N
{
   //define a class here
   struct A 
   { 
       void f() { std::cout << "N::A" << std::endl; }
   };
}

namespace M
{
   //define another class with same name!
   struct A 
   { 
       void f() { std::cout << "M::A" << std::endl; }
   };

   struct B : N::A  //NOTE : deriving from N::A
   {
         B()
         {
            A a;
            a.f(); //what should it print?
         }
   };
}

a.f() ne diyeyim? a türü nedir? M::A N::A. Cevabı, 12**, M::A.

Çünkü enjeksiyon ad, N::A B kurucu içinde kullanılabiliryeterlilik. AyrıcagizlerB kapsamı dışında kalır M::A,. Eğer M::A kullanmak istiyorsanız, o zaman M::A (veya daha iyi ::M::A) yazmak için.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Muse

    Muse

    28 EYLÜL 2006
  • Pituvision

    Pituvision

    11 Mart 2006
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012