Re: [Linux-programlama] c++ () operatör aşırı yüklemesi

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Caner KURTULMAMIS (ckurtulmamis@gmail.com)
Date: Thu 15 Dec 2005 - 13:41:20 EET


Cem Ahmet MERCAN (HBM) wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Merhaba;
>
> Öncelikle ilginize teşekkür ederim, bu arada cevabım da biraz uzun oldu
> galiba :)
>

  Ne demek efendim, bu tür "advanced" tartışmaya taraf olmak beni
sevindirir :)

> Burada benim sorunum "Bu aşırı yükleme neredeyse her zaman referans
> döndürür" cümlenizde olduğu gibi bir çok kaynak, derleyicinin const
> (değer) döndürdüğü durumlar da varmış gibi konuşuyor/kod yazıyor. Ancak
> ben bir tek çalışan örnek göremedim.
>

    Bir saniye verdiğiniz örnekte birşey atlamışım:

> int operator () (int a) const {cout<<"Değerle"<<endl; return i;}
  tanımlamadan sonraki const'u(kabul edersiniz ki, renklendirme lüksüne alışmış biri, renklendirme olmaksızın bunları gözden kaçırabilir :)), bu durumda verdiğiniz örneği aşağıdaki şekilde değiştirirsek sorun düzelir.

/*------------*/
m mm;
mm.i=2;
mm(2)=const_cast<m>(mm)(3);
cout<<mm(4);
/*-----------*/
Not:const_cast operatörünü fazla kullanmadığım(hatta hiç kullanmadım) için yanlışlık olabilir.

bu sefer muhtemel çıktı aşağıdaki gibi olucaktır:

çıktısı:
Referansla
Değerle
Referansla

  Diyeceksiniz ki, const_cast operatörünün orada işi ne? Ancak zaten doğru tasarımla bu tür şeyler, derleyicinin anlıyacağı biçime ulaşır. Mesela nesne zaten const halde döndürülürse, aşırı yüklemede, fonksiyonun const hali çağırılcaktır...
   C++'ta eğer hızlı kodlar isteniyorsa, const nesne&, dolayısıyla const olayına çok önem verilmesi gerekir. Ben bir ara bunun için bir deneme yapmıştım(bir kitabın gazıyla :)), const nesne& versiyonu, geçici ile çalışan versiyondan yaklaşık 3-4 kat hızlı çalışmıştı(ancak asıl farkı anlıyabimek için yoğun bir algoritma gerekiyor).

> USENET 'de comp.lang.c++.moderated listesinde yeni bir tartışmada da bu
> konunun konuşulduğunu buldum ama orada verilen kod da derleyici için
> aynı sonuçu veriyor. Orada da kimse değer versiyonu şu durumda çalışır
> yada çalışmaya zorlanabilir gibi birşey diyemiyor.
>
USENET'i maalesef birkaç haftadır takip edemiyordum, hangi başlık
olduğunu söyiyebilir misiniz?

> Yine sizin de önerdiğiniz "Hack" metodunu önerenler de var. Ama neticede
> benim sorum "const versiyonunu niye yazıyorsunuz? hiç bir zaman
> çalışmıyorki!" şeklinde. Ayrıca "Hack" yolları genelde son derece
> kullanışsız. Mesela sizin önerinizde sadece siz (o da unutmazsanız)
> oradaki fazladan parametrenin ne işe yaradığını bilebilirsiniz. Kodu
> anlaşılmaz bir hale sokacağı kesin. Sanırım temel sorun c++'da bir
> property kavramının olmaması.
>

  "Hack" konusunda haklısınız, ancak zaten, doğru tasarımla bu "Hack"
metoduna ihtiyacınız da yok... Const versiyon, sadece nesne const
olduğunda çalışır, ve tasarım buna uygun hazırlanırsa çok kullanışlı ve
hızlı kodlar üretmenizi sağlar. Ayrıca C++'ta çoğunlukla(aksi
gerekmedikçe, zaten o zaman tasarımda ona uygun yapılır) temp nesne
döndürmek yerine "const nesne&" şeklinde döndürme tercih edilir, bu
geçici yaratmanın önüne geçer, ve böylece uygulama hızlanır.
  Ancak "Hack" parametresinin ne olduğunu, eğer "hack" diye
adlandırırsanız, muhtemelen deneyimli bir programcı tarafından
anlaşılır. Tabi birde iyi dökümantasyonda şart...

void foo(int param, int hack)
{
   hack;/*warning'i gözardı et*/
}

> Yine pointer kullanımını da hataya açık bir çözüm olarak görüyorum,
> nesne dışına bir pointer verdiğinizde nesne üzerindeki kontrolü bozmuş
> oluyorsunuz. Ayrıca bütün bu operatör aşırı yüklemeleri zaten kodun daha
> kolay anlaşılır bir formda olması için yapılıyor. Pointer bu yapıyı çok
> bozuyor, bir set fonksiyonu yazmak bile daha mantıklı geliyor bana,
> pointer çözümüne göre. Mesela + operatörünü aşırı yüklediğiniz durumda
> kullanıcı m(2)+2 gibi bir şey yazdığında ortalık dağılır.
>
  Bu da bir bakıma doğru, ancak zaten ref.'i pointer yerine kullanmakta
yanlış.... Ancak zaten, m(2) + 2 gibi bir uygulama bence çok yanlış,
tabi tasarıma göre değişir ama yine de yanlış, asla böyle bir uygulama
yapılmamalı... En azından ben asla yapmam. C++'ın bu tür şeyler için çok
daha anlaşılır arabirimleri var, mesela: "(m << 2) + 2;" gibi, bu hali
çok daha anlaşılır.

> Kodu GNU g++ ile ve MS VS ile denedim sonuç aynı. Ayrıca () ve []
> operatörleri ile denedim. Hatta const ve referans operatörlerinin
> tanımlama sıralarını değiştirerek de denedim. Bir şey fark etmedi. Const
> versiyonun çalıştığı bir durum bulamadım. Yazılmasının sebebi de
> değişiklik yapılması / yapılmaması gereken kodları ayrı tutmak.
>

  Dediğim gibi, hangi derleyiciyi kullanırsanız kullanın, nesne const
olmadığı sürece sonuç her zaman ref. olacaktır.

> Ben kütüphane derken standart bir kütüphaneyi kast etmedim, Matris
> işlemleri için bir kütüphanenin (Matrix TCL Lite) kodları incelerken
> benim kodumda olduğu gibi bu iki farklı operatör yüklemesini
> kullandıklarını gördüm, daha önce de bir kitapta görmüştüm ve bunun
> üzerine uygulamıştım. Sonuçta sanırım sıkça kullanılıyor ama ben
> çalıştığı bir durum henüz bulamadım.
>
  Hmm, kodu görmem lazım, neyse...
> Saygılarımla, İyi Günler...
>
  Böyle ileri düzey C++ tartışmasına türkçe olarak uzun zamandır
katılmıyordum, iyi oldu :)

> Cem Ahmet MERCAN
>
>
>
_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.