Forum: Diğer Konular RSS
C++ - Statik Üye Verinin İlklenmesi
İbrahim #1
Üye Eki 2015 tarihinden beri · 156 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C++ - Statik Üye Verinin İlklenmesi
Selamün Aleyküm;

class Singleton
{
private:
  static Singleton* instance;
public:
  Singleton() : instance(new Singleton())
  {
  }
};
Bu kodu derlemeye çalıştığımda şu hatayı veriyor: error: 'Singleton* Singleton::instance' is a static data member; it can only be initialized at its definition
   Singleton() : instance(new Singleton)

                  ^
Bunu bu şekilde değil de şöyle yazmam gerektiğini öğrendim:
class Singleton
{
private:
  static Singleton* instance;
public:
  Singleton()
  {
  }
};
 
Singleton* Singleton::instance = new Singleton();
Sormak istediğim: Neden ilk koddaki şekilde olmuyor da 2. koddaki gibi sınıf dışında yazmak durumundayız?
Diğer sorum ise kodumu direk şu şekilde yazdığımda da aynı şekilde çalışıyor, new ile bellek ayırmak yerine new kullanmasak da aynı şekilde çalışıyor. Neden new kullanayım? :
// Direk bu şekilde de çalışıyor:
class Singleton
{
private:
  static Singleton* instance;
public:
  Singleton()
  {
  }
};
Teşekkürler.
Bu mesaj İbrahim tarafından değiştirildi; zaman: 2016-06-30, 15:28.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İbrahim:
Sormak istediğim: Neden ilk koddaki şekilde olmuyor da 2. koddaki gibi sınıf dışında yazmak durumundayız?

İlk koddaki kurucu işlev bu sınıf türünden nesnelerin ilklenmeleri içindir. Her nesne için işletilir. static üyeden tek adet bulunduğundan tek kere ilklenmesi gerekir. (Ya da, statik üyenin değerini her nesne oluşturulduğunda değiştirmek istemeyiz.)

Diğer sorum ise kodumu direk şu şekilde yazdığımda da aynı şekilde çalışıyor

Emin misin? Yanlış hatırlamıyorsam static üyeler sıfırlanırlar. Dolayısıyla göstergenin değeri 0'dır (NULL). Eğer kod gösterdiğin kadar basitse o üyeye erişmediğin için kötü bir sonuçla karşılaşmıyorsun.

Neden new kullanayım?

Göstergenin gösterdiği bir nesne var olsun diye. :)

Ali
İbrahim #3
Üye Eki 2015 tarihinden beri · 156 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Emin misin? Yanlış hatırlamıyorsam static üyeler sıfırlanırlar. Dolayısıyla göstergenin değeri 0'dır (NULL). Eğer kod gösterdiğin kadar basitse o üyeye erişmediğin için kötü bir sonuçla karşılaşmıyorsun.
Yani kastettiğim şuydu:
class Singleton
{
private:
  static Singleton* instance;
public:
  Singleton()
  {
  }
  void print_addr() const
  {
    cout << this->instance << endl;
  }
};
 
Singleton* Singleton::instance = new Singleton();
 
int main()
{
  Singleton* s0 = new Singleton();
  Singleton* s1 = new Singleton();
 
  s0->print_addr();
  s1->print_addr();
 
  return 0;
}
Bunun Çıktısı:
0x2607c20
0x2607c20

Görüldüğü gibi adresler aynı.

Singleton* s0 = new Singleton();
Singleton* s1 = new Singleton();

bu satırları şu şekilde değiştirdim:
Singleton* s0;
Singleton* s1;

Aldığım çıktı şöyle:
0x9f5c20
0x9f5c20

Bu çıktıda da 2 adres aynı, new kullanınca da adresler aynı. Ayrıca benim de bildiğim kadarıyla static üyeler ilk başta 0 alıyorlar.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ters anlamışım: instance'ı new ile oluşturuyorsun ama nesneleri oluşturmuyorsun. Yani, s0 ve s1 belirsiz değere sahipler. (s0 ve s1'i de yazdırmayı dene ama 0 bile çıksalar tesadüfendir.)

Eğer Singleton'ın static olmayan bir üyesi olsa (örneğin, 'int id;') ve onu kullanmaya çalışsak, bize ait olmayan bir belleğe erişmeye çalışmış olurduk.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 22:36:57 (UTC -08:00)