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 - 10:13:24 EET


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

Merhaba;

Öncelikle ilginize teşekkür ederim, bu arada cevabım da biraz uzun oldu
galiba :)

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.

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.

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ı.

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.

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.

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.

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

Cem Ahmet MERCAN

Caner KURTULMAMIS wrote:
> Bu aşırı yükleme neredeyse her zaman referans döndürür, temp nesneyi
> ne zaman döndürür pek emin değilim...
> Ancak böyle kodlamanın ne kadar sağlıklı olduğundan emin değilim, zor
> anlaşılır kodlara neden olabilir. Ama yine de bu örnek birazda
> derleyiciye davranabilir, aşağıdaki sonucu hangi derleyici de aldınız?
> GNU C mi?
> Ben illa kullanıcağım diyorsanız, size tavsiyem, sonradan ++
> operatöründe uygulandığı gibi bir "hacking" uygulamanız. örnek:
>
> class m
> {
> public:
> int i;
> int & operator () (int a){cout<<"Referansla"<<endl; return i;}
> int operator () (int a, int/*hacking*/) const {cout<<"Değerle"<<endl;
> return i;}
> };
>
>
> m mm;
> mm.i=2;
> mm(2)/*REF*/=mm(3, 0)/*TEMP*/;
> cout<<mm(4, 0)/*TEMP*/;
>
> ayrıca referans yerine pointer kullanmakta bir çözüm...
>
> Cem Ahmet MERCAN (HBM) wrote:
>
> Merhaba ;
>
> Birkaç yerde (ki bunlar1n en az biri kitapt1, bir dieri bir kütüphane):
>
>
>
>> Hangi kütüphane sorabilir miyim? STL'de böyle bir örnein olmad11ndan
>> neredeyse eminim. Boost olabilir mi?
>
> class m
> {
> public:
> int i;
> int & operator () (int a){cout<<"Referansla"<<endl; return i;}
> int operator () (int a) const {cout<<"Deerle"<<endl; return i;}
> };
>
> _eklinde () operatörünün a_1r1 yüklendii örnekler gördüm. Ancak
> yukar1daki örnek kullan1ld11nda:
>
> m mm;
> mm.i=2;
> mm(2)=mm(3);
> cout<<mm(4);
>
> ç1kt1s1:
> Referansla
> Referansla
> Referansla
>
> _eklinde oluyor. Bir _eyleri mi gözden kaç1r1yorum?
>
> NOT: Tabi ki yukar1daki program bu liste için a_1r1 basitle_tirdiim
> hali, dolay1s1 ile bir_ey yapm1yor.
>
> --
> Sayg1lar1mla, 0yi Günler...
>
> Cem Ahmet MERCAN
>
>
_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>>

> _______________________________________________
> 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)

iD8DBQFDoSWk938hjj8zEIMRAhg9AKCEYD+71jos9nwE+wcopzMA5kAK3ACgrht6
pMR9wcjQqPjGaEEAUREyqIg=
=3qy9
-----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.