8 Haziran 2017 Perşembe

Static Global ve Local Değişken

static kelimesi
static kelimesi overloaded bir kelime. Değişkenler veya metodlar için kullanılabilir.
Global değişken, lokal değişken, member değişken, global metod, member metod için kullanılabilir.
static global değişken
Açıklaması şöyle
3.6.2 Initialization of non-local variables
...
Variables with static storage duration (3.7.1) or thread storage duration (3.7.2) shall be zero-initialized (8.5) before any other initialization takes place.
Static global değişken program çalışmaya başlamadan yani main metoduna girmeden daha önce yaratılır.
Örnek - char * 
Main metodu çalıştıktan sonra ilklendirmek için şöyle yaparız.
static const char *my_static_string = nullptr;

...

void load_static_string()
{
  if(!my_static_string)
  {
    std::string str = //Read string from file.
    my_static_string = new char[str.size() + 1];
    strncpy(my_static_string, str.data(), str.size() + 1);
  }
}
Örnek - std::vector
Şöyle yaparız.
#include <vector>

std::vector<int> v;

int main()
{
    v.push_back(1);
}
Static Order Initialization Fiasco
Static Order Initialization Fiasco yazısına taşıdım.

static local değişken metod ilk kez çağırıldığında yaratılır
static local değişken yazısına taşıdım.

virtual static değişkenler
Genellikle her sınıfa yeni bir ID vermek için kullanılır. İki tane yöntem gördüm.

1. Her sınıf için static local değişken
İlk yöntem de her sınıfın static local bir ID değişkeni vardır. Bu değişken nesnenin ilk getXXX metodu çağrıldığında ata sınıfın yine static olan sayacı +1 yapılarak atanır. Sınıfların hangi değeri alacağı kontrol edilemez.

Önce bir ata sınıf tanımlanır. Ata sınıfın pure virtual bir metodu ve bir de sayaç görevi gören bir metodu vardır.
class Base {
   public:

      virtual int getCompType() = 0;

   protected:

      static int getNextCompType()
      {
         static int nextType = 0;
         return ++nextType;
      }
 };
Her kalıtan sınıf şöyle bir yöntem izler
class Real1: public Base {
   public:
  static int getCompTypeImpl()
  {
     static int myType = Base::getNextCompType();
     return myType;
  }

  int getCompType() override
  {
     return getCompTypeImpl();
  }
};
2. Her sınıf için static member değişken
Bu yöntemde her sınıfın static bir member değişkeni vardır. Bu değişken global bir sayaçtan yeni değer alır. Sınıfların hangi değeri alacağı kontrol edilemez.

class MyInterface{
virtual int getID() = 0;
};

class MyClass : public MyInterface{
COMPONENT(); //Arayüzü gerçekleştiren macro

SET_ID(MyClass); //cpp dosyasındaki sayaçtan yeni değeri alan macro

#define  COMPONENT()\
static int ID;\//Statik değişken tanımla
int getID(){return ID};//Arayüzü gerçekleştir

#define SET_ID(Component)\
int Component::ID = GetNextID();//GetNextID sayaçtan gelen yeni sayı


Hiç yorum yok:

Yorum Gönder