Tam Sürümünü Görmek İçin : interview questions #1
Volkan Uzun
27/07/2005, 09:42
bu aralar yaptigim interviewlerden bazi sorular, belki merak edenler olur neler soruyorlar diye
1. virtual destructor nedir, neden kullanirsin ve neden kullanmazsin
2. virtual inheritance nedir ne zaman kullanirsin
3. constructor hata olursa naparsin
4. destructorda hata olursa naparsin
5. static destructor ndir ne zaman kullanirsin
6. static constructor nedir ?
bugunluk bu kadar, yarin bir gorusmem daha var o sorularida yazarim :)
ilginç bir bilgi oldu, başka örneğini göremedim forumda, çok sağol..
yalnız o LA dikkatimi çekti :4: ,
bizimkiler ne soruyorlar acaba ?
birde bu managedC++ mi ?
Euclides
27/07/2005, 10:42
2. virtual inheritance nedir ne zaman kullanirsin
ostream vb... bu şekilde ios'a bağlılar ama bu soru dikkatimi çekti bir biraz çıtlatırsa ii olur.
Nedir ve ne zaman kullanırsın ?
Euclides
27/07/2005, 10:46
ok bir link buldum
http://faculty.edcc.edu/~pbladek/CMPSC143/VirtualInheritance.htm
Arkantos
27/07/2005, 12:32
Ben her zaman kelimelerin Türkçe karşılıklarını kullanmayı tercih ediyorum.
Interview Questions = Mülakat Soruları (İş Görüşmesinde Sorulan Sorular)
Virtual Inheritence = Ortak Kalıtım
Default Constructor = Parametresiz Kurucu
gibi ...
Bunları da C++ Terimleri Sözlüğü (http://groups.yahoo.com/group/cdili/message/715)'nden hoşuma giden Türkçe karşılıklarından aldım...
Bir de ortak kalıtımı (virtual inheritence) 'ın gerçekleştirmesini saf kuramsal öğe işlev :) (pure virtual member function) ve kuramsal öğe işlev (virtual member function) kullanarak gerçekleştiriyoruz değil mi :confused:
Yoksa ben mi karıştırıyorum .. ??
Bu arada LA sanırım Los Angeles'ın kısaltması herhalde ..
Bir de ortak kalıtımı (virtual inheritence) 'ın gerçekleştirmesini saf kuramsal öğe işlev (pure virtual member function) ve kuramsal öğe işlev (virtual member function) kullanarak gerçekleştiriyoruz değil mi cık..
birde .. saf sanal fonksiyon desek daha güzel olmaz mı..
nilsonmandela
27/07/2005, 12:53
Bunları da C++ Terimleri Sözlüğü (http://groups.yahoo.com/group/cdili/message/715)'nden hoşuma giden Türkçe karşılıklarından aldım...
Arkantos , bu terimler sözlüğüne başka nasıl ulaşabiliriz?
@Arkantos
dostum bu "saf kuramsal öğe işlev" i tırnak işaretlerini muhafaza ederek google da aratırsan,
ya da tırnak işaretlerini çıkarıp herhangi bir C++ koduna eklersen neler olur.. if ( saf_kuramsal_öğe_işlev) ?
yani öğrenmeye yaramamıyor, kod yazmaya yaramıyor...
:iih:
Arkantos
27/07/2005, 13:14
cık..
birde .. saf sanal fonksiyon desek daha güzel olmaz mı..
Aslında bana da biraz değişik geldi. Benim beğendiklerim yukarıda iki tanesi idi .. Dediğim gibi :)
Arkantos
27/07/2005, 13:21
Arkantos , bu terimler sözlüğüne başka nasıl ulaşabiliriz?
Terimler sözlüğüne ulaşmak için CDili'ne üye olman gerekiyor. Bunun için cdili_set@yahoo.com adresine tıklayarak boş bir mail göndermen yeterli. Ama bu durumda sadece yeni mesajlar gelir.
O yüzden web üzerinden erişmek istiyorsan http://groups.yahoo.com/group/cdili adresinden üye olarak kullanabilirsin. Eğer önceden yahoo hesabın varsa Sign In yazarak giriş yapıp gruba katılabilirsin ya da henüz yahoo hesabın yoksa New User? Sign Up kısmından yeni bir kullanıcı hesabı oluşturman gerekecek.
nilsonmandela
27/07/2005, 14:00
Belki başka bir yerde vardır da üye olmadan hallederim diye düşündüm ama olsun.Oldukça geniş bir kaynak.Tşkrler.
Euclides
27/07/2005, 14:09
TDK'nın da böyle bir çalışması var. Hatta bir de "sormacalar" hazırlamış
http://tdk.org.tr/sormaca.html
fakat böyle kelmeleri görünce biran düşünüp "yaw biz ne hakkında konuşuyoruz ?" diyorum...
Artalan İşi (Background job)
Gerileme (Backtracking)
Bekletici Program (Daemon)
Elmek (E-mail)
Faks Göndermek, Belge geçmek, Belgeçlemek (Fax)
Fiziksel Kesimli Disk (Hard-Sector Disk)
Örtük (Implied)
Birleşik Fotoğraf Uzmanları Grubu (Joint Photographic Experts Group JPEG)
Optik Disk Kutusu ( Juke Box )
Çekirdek İş Kanalı Nesnesi (Kernel Thread Object)
Anahtar Kabı Adı (Key Container Name)
Kiosk (Bilgisayar Köşkü, Bilköşk)
YAA Manager (LAN Manager)
Adres Mektup Birleştirme (Mail Merge)
Gerekli Aygıt (Native Device)
Olumsuz Alındılama (Negative Acknowledgement)
Amaç Program (Object Program)
Yarı Çap Sunucusu (Radius Server)
Sıcak Başlatma (Warm start)
o sorularida yazarim :)
mumkunse bunlari da alabilir miyiz ? merak iste :)
Volkan Uzun
27/07/2005, 17:50
4 saat sonra interviewdeyim gelince yazarim :)
Volkan Uzun
27/07/2005, 22:30
biraz evvel telefondaki interviewda sorulan sorular :
1. namespace nedir, name class nedir
2. late binding runtime binding compile time binding nedir
3. template class ile class template arasindaki fark nedir
4. struct ile array arasinda variable olarak fark nedir ( bu soru nedir ya )
5. dcom ile com arasindaki fark nedir
6. dangling pointer nedir
7. iterator class nedir
8. ole nedir
9. operator overloading nedir
10. new malloc arasindaki fark nedir
11. delete this ne yapar, neden
12. constructor initilization list i kullanmak zorunda oldugun bir yer soyle
13. static nedir
Volkan Uzun
28/07/2005, 00:53
virtual inheritance birden fazla classdan derive ederken parent bir kere eklensin diye
Volkan Uzun
28/07/2005, 01:43
interview sorularina calisirken veya netten yardim ararken soyle bir site buldum cok hos.
http://www.parashift.com/c++-faq-lite/index.html#search-the-faq
name class denen sunun gibi birsey mi?
class NameClass1{
public:
class A {
/*..................*/
}
}
Simdi A sanki bir ad alani icinde tanimli gibi oldu. Buna mi deniyor?
neurorebel
31/07/2005, 20:54
virtual destructor temel sınıftan türetilen tüm sınıfların destructorlarının zincirleme bir şekilde çağrılmasını sağlar. Temel sınıfta ayrılan kaynakları türetilmiş sınıfları yok ederken de geri vermem gerekiyorsa (ki gerekir neden gerekmesin ki ?? :) ) virtual destructor kullanmak gerekir. Böyle bir problem söz konusu değilse (temel sınıfta bir dosya handleı ya da bellek ayırma işlemi vs. yapılmıyorsa)virtual destructor kullanmaya gerek yok.
neurorebel
31/07/2005, 20:55
virtual inheritance türetilen sınıfın instancelarının parent sınıfın tek bir kopyasını(instance) paylaşmalarını sağlar.
neurorebel
31/07/2005, 20:59
constructorda hata olursa o ana kadar ayırdığım kaynakları release edip durumu izah eden bi exception fırlatırım.
#include <iostream>
using namespace std;
class Base
{
public:
Base(){ cout<<"Constructor: Base"<<endl;}
~Base(){ cout<<"Destructor : Base"<<endl;}
};
class Derived: public Base
{
public:
Derived(){ cout<<"Constructor: Derived"<<endl;}
~Derived(){ cout<<"Destructor : Derived"<<endl;}
};
int main()
{
cout<<"derived pointer - Derived instance\n"<<endl;
Derived *var1 = new Derived();
delete var1;
cout<<"\n\n base pointer - Derived instance\n"<<endl;
Base *var2 = new Derived();
delete var2;
}
virtual destructor e, C++ nın salaklığı yüzünden ihtiyaç duyuyoruz..
OO olduğunu iddia eden bir dilde şu olabilir mi ?
Animal *tweety1 = new Bird();
Bird *tweety2 = new Bird();
tweety->foo();
tweety nin ne yapacağı tamamen foo() nun virtual olup olmamasına bağlıdır..
yani sınıfın dizynına bakmadan bilemezsiniz..
hele dizayn değiştirilirse ,haberiniz bile olmaz..
yukarıda ki durumda farklı değil..yani destructor da da olan bu..
kayıp base class da değil, derived klasda oluyor.. acehreli beni bununla ilgili uyarmıştı.. vectorden türetme ile ilgili olarak...
constructorde hata olursa obje ne yapabilire gelince?
henuz ne kadarı kuruldu kurulmadı belli değil,bunun için çok sakat bir durum..
önerilen kurucunun objeyi sadece makul iyi durum (good-state) e getirmesi , yani mümkün olduğunca hata fırlatabilecek kod içermemesi...
neurorebel
01/08/2005, 00:46
bence tweety->foo() nun napacağının belli olmaması iyi bişey. yani daha doğrusu virtual anahtar kelimesi iyi bişey. 3. parti bir sınıf kütüphanesini kullanırken illaki dökümantasyonu bakarız değil mi ? dökümanlar bir üye fonksiyonun prototipini her zaman sunar. Bu şekilde açık hazırlanmamış dökümantasyonlar yüzünden C++'a salak demek pek iyi bişey değil :) Ayrıca tweety adlı bir nesneyi Bird varken Animal tipinde tanımlamak zaten yanlış. Sanal fonksiyonlar misal Zoo adındaki bir Animal * dizisini iterate ederken yararlıdırlar. Yani sanal fonksiyon tanımladık diye illa ki böyle amacı belirsiz kodlar yazmamıza gerek yok. C++'ın özelliklerini pek iyi tanımamaktan ileri gelir böyle karşıklıklar.
Bu konu başlığında cevap vermek isityorum böylece dersimi iyi çalışıp çalışmadığıma karar verebileceğim eksiklerimi lütfen belirtin;
5. static destructor nedir ne zaman kullanirsin
6. static constructor nedir ?Bu iki soruya inanın cevap veremiyorum bende cevabını merak ediyorum.
Bir sınıfın yapıcıları ve yıkıcıları neden static olarak tanımlansın üstelik bu üye fonksiyonların prototiplerinin tanımlamalarında hiç bir geri dönüş değeri de belirtilmez void bile ve bildiğim static olarak tanımlanmış bir üye fonksiyon ancak static olarak tanımlanmış veri üyesine erişebilir dolayısıyla yapıcı ve yıkıcı üye fonksiyonlar static olarak tanımlanabiliyorsa (-ki hala olabileceğine inanmıyorum) sınıf veri üyelerinin tamamına erişemeyecek ayrıca this göstericisinede sahip olamayacakdır.
Bence bu soru yanlış sorulmuşdur.
3. template class ile class template arasindaki fark nedir?Elimdeki kitapda şablon sınıflar ve sınıf şablonlarından şöyle bahsediyor.
Bir yazılımcı bir çok veri işleyebilmek için, bir şablon kod yazar ve bu sınıf için işlenecek veri tipileri tanımlandığında, tanımlanan veri ile o veriye ait sınıf için derleyici sınıf şablonu kodu derler.
Örnek:Önceden My_Sinif adında bir bir şablon sınıf tanımlamışsak My_Sinif<int> veri1 ve My_Sinif<char> veri2 şeklinde aynı sınıfımızın iki nesnesinide tanımlamışsak derleyici veri1 int türünden veriyi kullanabileceğimiz My_Sinif, veri2 için ise char türünden veriyi kullanabileceğimiz ikinci bir My_Sinif kodu hazırlar ve her bir hazırlanacak sınıfa sınıf şablonu denir.
new malloc arasindaki fark nedir?Bunu toplantımızda Ali hocayla konuşmuştuk kısaca;
Her ikiside Bellekde yer ayırır ancak mollac ile bir sınıfın nesnesi olarak yer ayrılmaz sizeof opretörüde kullanıldığında boyutu belirlenmiş bir bellek bölgesi ayrılmış olur ve dolayısıyla o sınıfın kurucusunu çağırmaz ve ayrılan bellek bölgesinde çöp değerler oluşur. new ile sınıf nesnesi olarak bellekde yer ayrıldığında sınıfın kurucusu çağrılır ve ilk değerler atanır.
namespace nedir, name class nedir?Aynı bilinirlik alanınında mesla bir header dosyasında aynı isimden birden fazla kez sınıfı vs. tanımlaya biliriz ancak isim alanları farklıdır dolayısıyla erişimide ikili faliyet alanı erişim işleci kullanarak erişebiliriz
Örnek:
namespace alan1{
class Ceviz{/*...*/}
}
namespace alan2{
class Ceviz{/*...*/}
}Burada global alanda iki tane Ceviz adında sınıf tanımlamamıza rağmen farklı alan adlarında yer almasından dolayı sorun oluşmamakdır.
C++'ın standart kütüphanesindeki bütün bileşenlerinin bildirimi std isimi verilen bir isim alanı içerisinde yapılmıştır.
bazı örnekler:
std::string
std::cout
std::cin
Sorunun devamındaki "name class nedir? ile ilgili bende bilmiyor bilgi bekliyorum
Saygılar...
neurorebel
01/08/2005, 06:08
valla inan o 5. ve 6. soru beni dehşete düşürdü heheh :) şu anda emin olmak için üşenmedim ve yazdım saçma sapan bi sınıf sonrada gördümkiii:
"error: constructors and destructors can not be static" :iih:
"namespace" bizi "name decoration" dan da kurtarır aynı zamanda :kuul:
neurorebel
01/08/2005, 06:23
destructor'da hata olursa naparız ya hakkaten :garip: bana kalırsa destructorda bir hata oluyorsaaa... olan olmuştur zaten tahmin etmediğimiz bişeyler ters gitmiştir. Dolayısıyla sessizce durumu kurtarmalı ve nesneyi yoketmeye devam etmek için elimizden geleni yapmalıyız. Eğer bir takım kaynakları release edemediysekte edemedik napalım... çalışmaya devam derim ben :D Şaka bir yana çok ciddi hataları destructorda handle etmek durumunda kalmışsak ya da bu tür tehlikeli hataları tetikleyecek fonksiyonları destructorda çağırmak zorundaysak sınıf tasarımını kesinlikle gözden geçirmeliyiz derim ben... :hmmm: Sabahın 6:24'ünde pek bişey gelmiyor aklıma... Herb Sutter'ın kitaplarına bir bakiym ne zamandır açmamıştım kapaklarını :1:
karamemed
01/08/2005, 09:14
Bu iki soruya inanın cevap veremiyorum bende cevabını merak ediyorum.
Bir sınıfın yapıcıları ve yıkıcıları neden static olarak tanımlansın üstelik bu üye fonksiyonların prototiplerinin tanımlamalarında hiç bir geri dönüş değeri de belirtilmez void bile ve bildiğim static olarak tanımlanmış bir üye fonksiyon ancak static olarak tanımlanmış veri üyesine erişebilir dolayısıyla yapıcı ve yıkıcı üye fonksiyonlar static olarak tanımlanabiliyorsa (-ki hala olabileceğine inanmıyorum) sınıf veri üyelerinin tamamına erişemeyecek ayrıca this göstericisinede sahip olamayacakdır.
Bence bu soru yanlış sorulmuşdur.
Static yapıcı için ben de derleyici hatası aldım. Ayrıca yapıcı private da olamıyor. Sanırım bunu ya yanlışlıkla sormuşlar, yada niçin buna ihtiyaç duyulur gibi bir soru işareti oluşturmak istemişler. Çünkü bu, Java gibi dillerde izin verilen bir durumdur bildiğim kadarıyla. Yani yapıcı statik ve private olabilir. Bu şekilde Singleton isimli tasarım örüntüsü (design pattern) gerçekleştirilir. Amaç bir nesnenin sadece bir kopyasının olmasının garantilenmesidir. Eğer yapıcı private olursa dışarıdan yapıcı çağrılamaz dolayısıyla nesne oluşturulamaz. Static olduğunda ise yapıcı daha program çalıştırılmadan çağrılır. Bu sayade nesnenin sadece bir kopyasının olması sağlanır. Peki ne gibi durumlarda nesnenin sadece bir kopyasının olmasını isteriz? Örneğin id verme işlemi için böyle bir sınıf tanımlarsak id verme işlemi tek elden yürütüleceği için aynı id'nin birden fazla üretilmesi engellenmiş olur. Bilindiği gibi bir id tek olmalıdır, eğer bir id birden fazla varsa hata vardır demektir. Eğer bu işi yapan nesnemizin birden fazla kopyasına izin verseydik aynı id'nin tekrarlanmaması için ektra önlemler almamız gerekecekti.
Peki c++'ta singleton isimli tasarım örüntüsü nasıl gerçekleştirilir?(Yani bir nesnenin sadece bir kopyasının oluşturulabilmesini nasıl sağlarız)
OO programlama , class sözcüğü ve information-hiding kavramları sloganlaştırılmış olduğu için ,belki C++ prestij için bunlara ihtiyaç duydu..
bence eğer fonksiyonlar varsayılan olarak virtual tanımlanmış olsaydı , class-struct ayrımı daha anlamlı olurdu..
@neuroebel : Yukarıdan da anlasılacagı gibi sorun virtual keyword ünün salak olması deil.. sorun muhtemelen bu neden başlangıç durumunda böle deil..
bi dönem (kısacık bi dönem.. 2 hafta kadar) java ile urastım.. onda virtual diye bisi yok diye biliyorum..yani :
class meyve {
public void foo() {
System.out.println("meyve");
}
}
class armut extends meyve {
public void foo() {
System.out.println("armut");
}
}
class Gonul
{
public static void main(String args[])
{
meyve meyvem = new meyve();
meyve meyvem2 = new armut();
meyvem.foo();
meyvem2.foo();
}
}
Çıktı :
meyve
armut
Yine c# ile kısa bi süre uraştım (3 günlük Ms Türkiye c# wörkşop unda).. onda bildiğim kadarıyla daha pis bi durum var (virtual ve override) :
class meyve
{
public virtual void foo()
{
Console.WriteLine("meyve");
}
}
class armut : meyve
{
public override void foo()
{
Console.WriteLine("armut");
}
}
class Class1
{
static void Main(string[] args)
{
meyve meyvem = new meyve();
meyve meyvem2 = new armut();
meyvem.foo();
meyvem2.foo();
}
}
bence tweety->foo() nun napacağının belli olmaması iyi bişey. yani daha doğrusu virtual anahtar kelimesi iyi bişey.
....
Ayrıca tweety adlı bir nesneyi Bird varken Animal tipinde tanımlamak zaten yanlış. Sanal fonksiyonlar misal Zoo adındaki bir Animal * dizisini iterate ederken yararlıdırlar.
...
foo nun ne yapacağının belli olmaması iyi birşey değil tabii ki..
OO bir dilde tweety, Bird olduğu için Bird deki foo sürümü çalşıtırılır..
C++ da ise foo() virtual değil ise cast yapman gerekir..hatta destructor de bile bu böyle..???
Animal* tweety = new Bird();
(Bird*)tweety->foo() ;
....
genelleştirme OO nun en önemli özelliğidir.
bu sayede Animal den türüyecek herşey için çalışacak kodu daha bu sınıfları bilmeden yazabilirsin..çünkü onların uyması gereken protokolü biliyorsundur..
örnek :
//hayvan hastanesi henuz kuş tedavi etmiyor..
setOwner( Animal* a , Person* p);//tanımlı
//bir süre sonra başladılar..kod aynı...
Bird * tweety1 = new Bird();
Animal tweety2 = new Bird();
setOwner( tweety , neurorebel );//çağrı..
......
Static yapıcı için ben de derleyici hatası aldım. Ayrıca yapıcı private da olamıyor.
..
ben private tanımlayınca hata almadım, ama private kurucusu olan bir sınıftan türetme izin vermiyor..( düşününce mantıklı..)
aynı etki için kurucunun protected olarak tanımlanması mümkün..o zaman sorun kalmıyor..
daha sonra public static bir metod ile protected kurucuya erişim vererek static kurucu etkisini elde edebiliriz..
@sckz
o override sözcüğü bayıldım..
şimdi IDE reklendirmese (java-JBuilder ), üstüne mi yazıyorum, yeni sürümünü yazıyorum belli değil..
Peki c++'ta singleton isimli tasarım örüntüsü nasıl gerçekleştirilir?(Yani bir nesnenin sadece bir kopyasının oluşturulabilmesini nasıl sağlarız)
seni dogru anladıysam, basitçe şöle bişi olabilir belki ama sınıf büyüdüğünde biraz kasmak gerekebilir :
class ArmutunKendisi
{
private :
Armut(); // sadece friend tarafından erisilebilir
~Armut();
friend class Armut;
};
class Armut
{
public :
Armut();
~Armut();
// ArmutunKendisi ne erişmek için işaretçi tanımlanabilir...
private :
static int ctorCagirildiMi; // disaridan erisilemezler
static int dtorCagirildiMi;
};
int Armut::ctorCagirildiMi = 0;
int Armut::dtorCagirildiMi = 0;
Armut::Armut()
{
if (0 == ctorCagirildiMi)
{
ctorCagirildiMi = 1;
// ArmutunKendisini yarat vs vs
}
}
Armut::~Armut()
{
if (0 == dtorCagirildiMi)
{
dtorCagirildiMi = 1;
// vs vs
}
}
@mr1yh1 : ?
bazı noktalarda bence soyutlama gerekiyor.. örnegin Animal sınıfında da Bird sınıfında da depar_at() isimli üye fonksiyon olsun.. burda biz tweety ye depar attıracaksak bırakalım o nası atıyorsa atsın.. sonuçta virtual yapılmamışsa demekki o da diğer Animal sınıfından yaratılan nesneler gibi depar atıyordur..
gerçi ben yine tweety diğer hayvanlar gibi depar atıyosa bile şu şekilde tanımlamayı tercih ederdim :
class Animal
{
// ...
virtual void depar_at()
{
cout << "paldır küldür koş";
}
//...
};
class Bird : public Animal
{
// ..
void depar_at()
{
Animal::depar_at();
}
//..
};
Peki c++'ta singleton isimli tasarım örüntüsü nasıl gerçekleştirilir?(Yani bir nesnenin sadece bir kopyasının oluşturulabilmesini nasıl sağlarız)
#include <iostream>
using namespace std;
class Base// singleton
{
static Base *p;
protected:
Base(){ cout<<"Constructor: Base"<<endl;}
public:
static Base* foo() {
if (p == NULL) { p = new Base(); return p; };
return p;
}
};
Base* Base::p = NULL;
//***********************
int main()
{
Base* p = Base::foo();
cout<<p<<endl;
Base* q = Base::foo();
cout<<q<<endl;
}
karamemed
01/08/2005, 10:57
@mr1yh1,@sckz
Maalesef ikinizin yaklaşımı da hatalı. Aslında oldukça güzel çözümler. Fakat bir if kontrolü ile birden fazla nesnenin yaratılmasını önlediğiniz için çok parçacıklı (multithread) bir uygulamada if kontrolünü birden fazla parçacığın geçme ihtimali var. En azından teorik olarak. Yani olasılık % 1 'den az olsa da çok parçacıklı bir uygulamada birden fazla nesne üretilebilir. Bunu engellemek için Monitor gibi yaklaşımlar kullanılabilir. Yani kritik kod kesimine birden fazla uygulama girmemeli. Ekstra önlemden kastım bu idi aslında.
karamemed
01/08/2005, 11:03
Bu arada private yapıcıyı derledim. Uzun zamandır c++'tan uzak kalmaktan dolayı private yapıcı(){} gibi saçma bir sözdizimi kullanmışım. Sizin kodları görünce jeton düştü. :)
@karamemed
foo static olduğu için , p ve q Base::foo() ile yaratılmıyor..p = new Base(); ile yaratılıyor..
java da olduğu gibi değil olay yani..
java ,bir sınıfın static üyesini çağırırsak sınıfı kuruyor bildiğim kadarı ile..( öyle mi ? )
pardon yanlış anlamışım..
haklısın, sadece bu model için değil , genel olarak var bu tehlike , C++ multithreading e built-in destek vermiyor maalesef..
Base::p yi korumak lazım..
karamemed
01/08/2005, 20:59
.....Bu şekilde Singleton isimli tasarım örüntüsü (design pattern) gerçekleştirilir. Amaç bir nesnenin sadece bir kopyasının olmasının garantilenmesidir. Eğer yapıcı private olursa dışarıdan yapıcı çağrılamaz dolayısıyla nesne oluşturulamaz. Static olduğunda ise yapıcı daha program çalıştırılmadan çağrılır.
Burada bir hatamı düzelteyim. Yapıcının static olması durumunda yapıcının program çalışmadan çağrılacağını söylemişim. Böyle birşey yok. Sanırım static değişkenler ilk işlem görendi, tam hatırlamıyorum.
Bu arada Singleton'ın gerçekleştirimleri:
Java ile : http://www.javacoffeebreak.com/articles/designpatterns/
c++ ile: http://www.codeproject.com/cpp/singletonrvs.asp#xx935971xx , http://gethelp.devx.com/techtips/cpp_pro/10min/10min0200.asp
c# ile: http://www.yoda.arachsys.com/csharp/singleton.html
c# Türkçe : http://www.msakademik.net/makaleler_detay.aspx?id=132 (üyelik gerektirebilir)
Görüldüğü gibi en esnek olan c#. lock anahtar kelimesini ilk kez görüyorum doğrusu.
c++ gerçekleştirimlerinde buradaki olan çözümler söz konusu. Yani çok parçacıklı olduğunda sorunlu.
yukarıdaki if kontrollerinin multithread'de neden güvenli olmadığı hakkında genel bir bilgi verir misiniz?
Euclides
03/08/2005, 15:20
@mr1yh1,karamemed:
çok güzel bir keyword var "volatile"
ve ayrıca şunun altını çizmek isterim 1 Process'in sahip olduğu tüm thread'lar aynı hafıza bloğu içindedir.
Fakat bir if kontrolü ile birden fazla nesnenin yaratılmasını önlediğiniz için çok parçacıklı (multithread) bir uygulamada if kontrolünü birden fazla parçacığın geçme ihtimali var. En azından teorik olarak. Yani olasılık % 1 'den az olsa da çok parçacıklı bir uygulamada birden fazla nesne üretilebilir. Bunu engellemek için Monitor gibi yaklaşımlar kullanılabilir. Yani kritik kod kesimine birden fazla uygulama girmemeli. Ekstra önlemden kastım bu idi aslında.
1'den falza CPU'ya sahip bir sistemde dediğinin olduğunu düşünelim.Hata meydana gelir ve Programımız devam edemez.
TV de bir belgeselde birşey gördüm..
bir böceğin, avladığı bir başka böceği yuvasına götürmesi ile ilgili idi...
böcek şu işlemleri sırasıyla ve istisnasız yapıyor:
1-) avı yuvanın ağzının 4-5 cm yakınına kadar taşı...
2-) avı bırak , yuvaya gir , güvenli olup olamadığını kontrol et..
3-) güvenli ise bıraktığın yerdeki avı yuvaya sok..
ama bir bilim adamı, böcek 2. adımı gerçekleştirirken, avı yuva ağzının biraz daha uzağına sürüklüyor..( kaynak paylaşımı ..)
böcek dışarı çıkıyor ama bıraktığı yerde avı bulamıyor ( avı tutan, NULL olmuş )..
tekrar avlanma moduna giriyor ve az ilerideki aynı avı buluyor..
ve 1. adıma tekrar dönüyor ..
( bilim adamı da kendi döngüsü içerisinde ilk adıma geri dönüyor ..)
@ortug: yukarıdaki kodlar, programcının tercihine kalmış olan , concurrency durumunda sorun çıkarır...
yani işletim sisteminin özelliği olan multithreading kavramı ile doğrudan ilgisi yokdur...
Euclides
03/08/2005, 16:35
TV de bir belgeselde birşey gördüm..
bir böceğin, avladığı bir başka böceği yuvasına götürmesi ile ilgili idi...
böcek şu işlemleri sırasıyla ve istisnasız yapıyor:
1-) avı yuvanın ağzının 4-5 cm yakınına kadar taşı...
2-) avı bırak , yuvaya gir , güvenli olup olamadığını kontrol et..
3-) güvenli ise bıraktığın yerdeki avı yuvaya sok..
ama bir bilim adamı, böcek 2. adımı gerçekleştirirken, avı yuva ağzının biraz daha uzağına sürüklüyor..( kaynak paylaşımı ..)
böcek dışarı çıkıyor ama bıraktığı yerde avı bulamıyor ( avı tutan, NULL olmuş )..
tekrar avlanma moduna giriyor ve az ilerideki aynı avı buluyor..
ve 1. adıma tekrar dönüyor ..
( bilim adamı da kendi döngüsü içerisinde ilk adıma geri dönüyor ..)
Tam olarak ne demek istediğini anlayamadım m1 fakat anladığım kadarıyla şunu söyleyeyim
NULL olmak değişkenini var olmadığı anlamına gelmez hele elimizde bunun gibi bir
static Base *p;
şey varsa. meslea aşağıdaki tüm NULL pointerların her biri 4 byte yer kaplar
static HEBELE *h = NULL;
static HEBELE **h = NULL;
static HEBELE ***h = NULL;
görüldüğü gibi göstediklerilerin bağımsız olarak yer kaplarlar.
@Euclides
ben o mesajı yazarken sen benden önce davranıp seninkini atmışsın..benim anladığım karamemed concurrency anlamında söylüyor bunları..
mesela :
programda iki adet thread yaratmış olsa idim,
ve her biri Base::foo() ile singleton objesini istese idi..
bunlardan birincisi if i geçiyor çünkü p = NULL...
daha sonra P = new Base() ile p yi değiştirecek..
burada bellek ayırımı ,kurucunun çalışması, bellek adresinin p ye yüklenmesi aşamaları var..
bu arada ikinci thread if i geçebilir.. maalesef volatile işe yaramaz, ( bildiğim kadarı ile o sadece işlemcinin optimizasyon yapmamasını , herzaman p yi kendi adresinden okumasını sağlıyor)...
bu durumda 2. thread farklı bir singleton!! objesine sahip olacak..
karamemed in c# linkinde, if kısmından önce p kilitlenmiş..
yani böcek yuvasına kontrole girmeden önce avın üstünü kapatmış...
lock (padlock)
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
C++ de destek yok derken , tabii ki kütüphaneler var, sende winApi ile o kodu sağlam hale getirebilirsin ama built-in ( java daki Ada95 deki gibi ) destek yok..
Euclides
03/08/2005, 18:43
@mr1yh1:
haklısın. gözden kaçırmışım.
myavuzselim
03/08/2005, 18:50
Görüldüğü gibi en esnek olan c#. lock anahtar kelimesini ilk kez görüyorum doğrusu.
Bu javada da var.
http://www.25hoursaday.com/CsharpVsJava.html#synchronization
acehreli
10/08/2005, 17:45
Selamlar,
Sonunda bu konuya bakacak zaman bulabildim. Kisa tutacagim cunku eminim henuz okumadigim yerlerde bunlar zaten yanitlanmistir.
1. virtual destructor nedir, neden kullanirsin ve neden kullanmazsin
Neden kullanildigina iki gecerli yanit verebilirim:
1a: Standart, bir alt sinif nesnesini onu gosteren bir ust sinif isaretcisi yoluyla sonlandirmanin tanimsiz davranis oldugunu soyledigi icin, ve bizim boyle sonlandirilan bir nesnemiz oldugunda:
class Hayvan { /* ... */ };
class Kedi : public Hayvan { /* ... */ };
Kedi * kedi = new Kedi;
Hayvan * hayvan = kedi;
// Eger Hayvan::~Hayvan kuramsal (virtual) degilse,
// asagidaki islem davranistir; cunku standart boyle soyler:
delete hayvan;
1b: Nesnenin sonlandirilmasi sirasinda dogru islev bulunsun diye. Nesnenin asil tUrUnun ne oldugunu bilmiyorsa, derleyici ancak ust sinif bozucusunu cagirabilir. Yukaridaki ornekte Kedi sinifinin kendisine ait kaynaklari oldugu durumda, onlarin da geri verilebilmeleri icin once Kedi::~Kedi islevinin cagrilmasi gerekir.
Bozucu islev kuramsal olmadigi zaman, kendisi kuramsal islev isaretcisi tablosunda yer almaz. Bu yuzden de cagrilamaz:
void foo(Hayvan * hayvan)
{
// Eger Hayvan::~Hayvan kuramsal degilse, burada derleyici
// hayvan adli nesnenin asil tUrUnun bozucusunun hangi islev
// oldugunu bilemez, cunku elinde yalnizca bir Hayvan isaretcisi
// vardir.
delete hayvan;
}
Iyi kodlama ogutleri icinde "kuramsal islevleri olan siniflarin bozucularini da kuramsal yapin" gibi bir ogut vardir.
Buna ragmen, eger nesne ust sinif isaretcisi ile sonlandirilmayacaksa, bu kurala uyulmamasi gerektigini savunanlar da vardir. Pete Becker'in bu yolda tartistigini hatirliyorum.
2. virtual inheritance nedir ne zaman kullanirsin
Kalitim sirasinda ust siniflarin butun ust siniflari da alt sinif nesnesinin parcalari olurlar. Coklu kalitim durumunda, birden fazla ust sinifin kendilerinin ayni ust sinifa sahip olmalari durumunda, o ortak ust sinifin alt sinif nesnesinde birden cok sayida belirmesini onlemek icin kullanilir.
3. constructor hata olursa naparsin
Istisna (aykiri durum - hata - exception) atarim
4. destructorda hata olursa naparsin
Hicbir sey yaparim :) Ama bozucu islevden kesinlikle bir istisna sizmamasini saglarim.
5. static destructor ndir ne zaman kullanirsin
6. static constructor nedir ?
Ben de bu ikisinin singleton konusu ile ilgili oldugunu dusunuyorum.
Ali
acehreli
10/08/2005, 17:53
Ikinci grup sorular icin de cok kisa olarak soyle:
1. namespace nedir, name class nedir
ceeyt'in soyledigi gibi... Ad alanlarinin (namespaces) C++'a eklenmesinden once, ad alanlari yerine kullanilan yontemdi. (Benim zamanimdan once :) )
2. late binding runtime binding compile time binding nedir
Programda kullanilan bir adin ne oldugunun ne zaman belirlendigidir: derleme zamaninda, calisma zamaninda, baska?
3. template class ile class template arasindaki fark nedir
Bu da galiba soyle:
class template: bildigimiz sinif sablonu
// class template
template <class T>
class ClassTemplate
{
/* ... */
};
template class: bir sablonun bir tUr icin sinif olarak kullanilmis hali
ClassTemplate<int> int_ile_kullanilmis_hali; // <-- template class
4. struct ile array arasinda variable olarak fark nedir ( bu soru nedir ya )
Daha once de konusuldugu gibi, tek farklari ogeleri icin ve tureme sirasindaki varsayilan erisim haklaridir: struct'ta public, class'ta private.
5. dcom ile com arasindaki fark nedir
Ne? :)
6. dangling pointer nedir
Galiba gosterdigi nesne coktan sonlanmis olan isaretci.
7. iterator class nedir
Topluluk ogelerine erisim saglayan sinif. Turden bagimsiz STL kutuphanesinin yapi taslarindan birisi. Topluluk turlerinden bagimsiz olarak algoritma yazmamizi saglarlar. vs.
8. ole nedir
Boga guresi sozu :)
9. operator overloading nedir
Hem herhalde zaten herkes biliyor, hem de su anda tembelim.
10. new malloc arasindaki fark nedir
new iki is yapar: 1) Nesne icin yer bulur 2) Nesneyi orada kurar
malloc tek is yapar: 1) Istenen buyuklukte yer ayirir
11. delete this ne yapar, neden
Nesnenin intihar etmesidir. Bazi durumlara uygun oldugunu duymustum ama kendim hic gerek duymadim. Bu islem normalde bozucu islev icinde cagrilir. Cagrildiktan sonra static olmayan hicbir oge islevin cagrilmamasi gerekir, cunku nesne artik yoktur. :)
12. constructor initilization list i kullanmak zorunda oldugun bir yer soyle
Aklima iki durum geliyor: 1) referans oge bulundugu durum, 2) 'const' oge bulundugu durum.
13. static nedir
Bir suru seydir. (Uzun hikaye) :)
Ali
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.