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: Cem Ahmet MERCAN (HBM) (mercan@be.itu.edu.tr)
Date: Thu 15 Dec 2005 - 15:53:08 EET


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Merhaba;

Öncelikle USENET'te
http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/64aee048f049047c
adresindeki "operator overloading" başlıklı tartışmayı kast etmiştim.
Kütüphanenin kodlarına bakmanız için ise:
http://www.techsoftpl.com/matrix/download.htm

Cevabınızda bahsettiğiniz const nesne döndürmek (eğer yanlış
anlamadıysam) sorunu çözmüyor, zira derleyici her zaman const olmayanı
tercih ediyor. Yani:
int operator () (int a) const {cout<<"Değerle"<<endl; return i;}
ile
const int operator () (int a) const {cout<<"Değerle"<<endl; return i;}
arasında bir fark oluşmuyor zira zaten başvurulmayan bir fonksiyonu
değiştirmiş oluyorsunuz.

Verdiğiniz örnek koddaki const_cast metodunu denedim. Sizin de
kabul ettiğiniz gibi bu kodu yazma amacımız ile çelişen bir karmaşılığı
olmasına rağmen bu kod da işe yaramıyor. Sonuçta referansla dönen değeri
 değiştirmeyi engellemiş oluyoruz sadece. Ama gene referans kullanan
fonksiyon çağrılıyor. Takip edenler için kullandığım şeklini de vereyim:
m(2)=const_cast<int&>(m(3));

Muhtemelen daha iyi bir tasarım bu problemleri geçersiz kılıyordur ama
ben henüz o seviyede bilgi sahibi değilim.

Saygılarımla, İyi Günler...

Cem Ahmet MERCAN

Caner KURTULMAMIS wrote:
> 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
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (MingW32)

iD8DBQFDoXVE938hjj8zEIMRAphlAJ4vhw5rxMqGZoPb1JtvmSaH/XpFtwCfadLc
QfIfQz0ZztWQY5HurIxSZnA=
=km0G
-----END PGP SIGNATURE-----
_______________________________________________
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.