Elimde bir class var ve ben bu classı kopyalamak istiyorum d de bunu nasıl yapabiliriz?
Zekeriya
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Thread overview | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Elimde bir class var ve ben bu classı kopyalamak istiyorum d de bunu nasıl yapabiliriz? Zekeriya -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) |
-- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Bunu daha önce konuştuğumuzu hatırlıyorum ama gelişen durum gösteriyor ki unutmuşum...:rolleyes: Belki Ali hocam derslerinde bile işlemiştir ama basit bir string'de bile .dup kullandığımıza göre sayılar dışında kalan tüm değişkenler/yapılara artık işaretçi gözüyle bakmalıyız. Yani işaretçi kopyalanıyormuş...:) Peki hocam kopyalanan sınıfın, alt sınıfı olsaydı ama kurulurken alt sınıf boş olarak eşitlenmiş olsaydı n'apardık? Hazırladığım şu örnekteki gibi:
Dip Not: Alt sınıf benzetmesi yanlış oldu, "üyesi başka bir sınıf" demek daha doğru... -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Muhtemelen şu an cevap yazıyor olmalısın ama sanırım cevabın tek şıkkı bu olsa gerek:
Yani kopyala()'nın doğru çalışması için tüm üyelerine veri verebilmeli değil mi hocam? -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Kopyalama işlemini ben de bu şekilde yaptım. Ama yaptığım doğru gelmemişti. Salih hocamın dediği .dup gibi birşey vardır diye bekledim biraz araştırdım benim gibi böyle bir şey isteyenler varmış ama bu yöntemini kullanmaktan başka çare yok maalesef. Teşekkürler Zekeriya -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Alıntı (acehreli): >Ben bütün 'sınıf'ı göndermeyi düşünmüşüm, sen onun 'adı' üyesini. Duruma göre hangisi daha mantıklıysa... :) -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Anladım... Şöyle kurucu yüklemesi aptım ama ya "access violation" hatası aldım ya da "assertion failure" uyumsuzluğu oldu:
Çünkü kopyalayı ilk kullandığımda başlangıçtaki aynı üyeyi (kar sınıf) paylaşmasına neden oluyor. Bende ilk aklıma gelen çözüm ile ikincisinin karışımını denediğimde "access violation" hatası alıyorum...
Dikkat ederseniz kopyala() işlevinin yanındaki const takısını iptal ettim çünkü bu sefer de başka hata veriyordu. Herhalde sınıf bir immutable yapı olmadığı için. Çünkü string verirken sıkıntı yaşatmamıştı. Off....:( Kafam karıştı, ilk çözüm içime sindi aslında. Bir tek üye olarak kullandığınız sınıfın içeriğini bilmeniz gerekiyor. Düşünsenize bu harici bir sınıf olsaydı ve sadece bize bildirilen üyeleri bilseydik gerçek manada kopyalayamazdık. Yine bir of, çok kafa karışıtırıcı! Sevmedim bu işi...:D -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Yanıltıcı. :) Sınıflar referans türü olduğu için yine de tek nesne var. foo ve bar değişkenleri aynı nesneyi gösteriyorlar. Sınıflarda bir üye işlev yazmak şart: dup(), clone(), kopyası(), vs. gibi bir isim uygundur:
Ali -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Alıntı (Salih Dinçer): >sayılar dışında kalan tüm değişkenler/yapılara artık işaretçi gözüyle bakmalıyız. Yani işaretçi kopyalanıyormuş...:) Biraz karışık söyledin çünkü buradaki ayrımın değer türü ile referans türü arasında yapılması gerekiyor. O yüzden yapılarda böyle bir sorun yok. Onlarda da nesne kopyalanır. Kısa hatırlatma: Atama işlemi sonucunda soldaki değişkenin değeri değişiyorsa değer türüdür. Eğer soldaki de sağdakinin eriştirdiği nesneye erişim sağlamaya başlıyorsa referans türüdür. Alıntı: >Peki hocam kopyalanan sınıfın, alt sınıfı olsaydı ama kurulurken alt sınıf boş olarak eşitlenmiş olsaydı n'apardık? Örneğine bakılırsa alt sınıf değil de üye değişken kastediyorsun. Ancak, bunu cevaplamaya geçmeden önce sınıf nesnesi kopyalamanın aslında sanıldığı kadar yaygın bir ihtiyaç olmadığını belirtelim. Zaten bu yüzden bu kavram kitapta ve D projelerinde sık görülmüyor. C++'ta yapılar ve sınıflar değer türüdür. Java'yı tasarlayanlar bunun yanlış olduğunu düşündükleri için Java'nın sınıflarının referans türü olarak tasarlamışlardır. (Başka çok dilde de öyle.) D ise yapıları C++'taki gibi değer türü, sınıfları da Java'daki gibi referans türü yapmıştır. Kendi deneyimlerime bakarsam bunun doğru olduğunu görüyorum. Kendi C++ projelerimizde sınıf nesneleri hemen hemen her zaman tek oluyorlar. Nesne kopyalama yaygın bir kavram değil. Üstelik, programın hata atıldığında da doğru işleyebilmesi (exception safety) için nesnelere shared_ptr ile erişilmesi gerekiyor. Öyle olunca da C++'ta referans türü kavramını gerçekleştirmiş oluyoruz. Sonuçta, tasarımlarda hangi türün değer türü hangisinin referans türü olacağı genellikle baştan biliniyor. Referans türüyse de kopyalamak pek gerekmiyor. Notlarımı kodun içine yazayım:
Ali -- |
March 07, 2013 Class kopyalama | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Alıntı (Salih Dinçer): >cevabın tek şıkkı bu olsa gerek: Ben bütün 'sınıf'ı göndermeyi düşünmüşüm, sen onun 'adı' üyesini. Duruma göre hangisi daha mantıklıysa... :) Eğer bu kurucu yalnızca bu sınıfın kendi işi için yararlıysa 'private' olarak işaretlenmesinde de yarar var. Ali -- |