25 Aralık 2017 Pazartesi

Inner Class

Giriş
Local class olarak ta adlandırılıyor. Local class bir metoda yardım etmek için kullanılır.

Inner Class bir metodun içinde sınıfın olmasıdır. Nested Class ise bir sınıfın içinde başka sınıfın olmasıdır.

Dıştaki Metodun Local Class'a Erişimi
Her zamanki C++ kuralları gereğince dıştaki metod içerdiği local class'ın private alanlarına erişemez.
Ancak dıştaki metod friend yapılarak bu kural aşılabilir. Dıştaki metod haricinde bir başka metod friend yapılamaz!
"Enclosing function cannot access the private members of a local class. However, we can achieve this by declaring the enclosing function as a friend."
Örnek
Örnekte pqr metodu abc local sınıfını yaratıyor ve private x alanına erişiyor. pqr metodunun local class tarafından friend olarak tanındığına dikkat etmek lazım.
int pqr() {
    class abc {
        int x;
    public:
        abc() : x(4) { }
        friend int pqr();
    };
    return abc().x;
}

int main() {
    cout << "Return " << pqr() << endl;
}

Local Class'ın Dıştaki Metoda Erişimi
Aşağıda local class bir metod içinde tanımlı içteki sınıfın dıştaki metodun hangi alanlarına erişebileceği gösteriliyor. Local class'ın metodlar inline olmalı ve static attribute içermemeli.
void f() // function definition
{
  static int y; // static variable y can be used by local class
  int x; // auto variable x cannot be used by local class
  extern int g(); // extern function g can be used by local class

  class local
  {
    int g() {return x;} // error local variable x cannot be used by g
 
    int h () {return y;} // valid static variable y 
    int k () {return ::x;} // valid global x
    int l() {return g();} // valid extern function g
  }
}
Local Class'ın Dışa Verilmesi
Açıklaması şöyle.
name visibility doesn't hide the type. It just hides the name of the type.
Örnek
Şöyle yapabiliriz. a yapısıs func() içinde tanımlı olmasına rağmen döndürülebilir.
auto fun()
{
  struct a
  {
    int num = 10;
    a()
    {

      cout << "a made\n";
    }
    ~a()
    {
      cout << "a destroyed\n";
    }
  };
  static a a_obj;
  return a_obj;
}


int main()
{
  auto x = fun();
  cout << x.num << endl;

}
Örnek
Şöyle yapabiliriz. Hidden yapısı fun() içinde tanımlı olmasına rağmen döndürülebilir ve başka metoda parametre olarak geçilebilir.
auto fun()
{
  struct Hidden { int a; };

  return Hidden{24};
}

template <class T> auto fun2(T param)
{
  cout << param.a << endl; // OK
} 

auto test()
{
  fun2(fun()); // OK
}



Hiç yorum yok:

Yorum Gönder