From: Caner KURTULMAMIS (ckurtulmamis@gmail.com)
Date: Thu 15 Dec 2005 - 17:09:15 EET
Cem Ahmet MERCAN (HBM) wrote:
> -----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.
>
Hmm, Michael Wild'ın açtığı başlık... Daha sonra inceliyeceğim...
> Kütüphanenin kodlarına bakmanız için ise:
> http://www.techsoftpl.com/matrix/download.htm
>
Kodları daha sonra incelerim...
> 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.
>
Öncelikle maalesef benim uygulamaya kalktığım(ve beceremediğim) şeyi
siz yanlış anlayıp, yanlış uygulamışsınız... const_cast ile normal bir m
olan mm'i const m'e dönüştürüp, onun ile operator ()'ü çağırmaktı ancak
siz normal m ile operator ()'i çağırıp, döndürdüğü int'i const int'e
çevirmişsiniz. Neyse, const_cast'i bilmediğim ve muhtemelende bilmeme
hiç gerek duymayacağım için bu sefer, C++ için güvenliksiz C stili
type_cast ile aynı şeyi uyguladım ve denedim...
/*----------------------------------------------*/
#include "stdafx.h"
#include <iostream>
class m
{
public:
int i;
int & operator () (int a){std::cout<<"Referansla"<<std::endl; return i;}
int operator () (int a) const {std::cout<<"Degerle"<<std::endl;
return i;}
};
int main(int argc, char* argv[])
{
m mm;
mm.i=2;
mm(2)=((const m)(mm))(3);
std::cout<<mm(4)<<std::endl;
return 0;
}
/*---------------------------------------------*/
Çıktısı:
-------------------
Degerle
Referansla
Referansla
2
-------------------
> 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));
>
Ben orada şunu anlatmaya çalıştım, bir const fonksiyonu sadece(eğer
aşırı yüklenmiş bir normali varsa) const nesne ile çağırabileceği.
Buna örnek içinde aşağıdaki kodu yazdım. Gerçekte uygulamaları, STL
kütüphanesinde bolca mevcut...
/*------------------------------------------------*/
// CConst.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
class m
{
public:
int i;
int & operator () (int a){std::cout<<"Referansla"<<std::endl; return i;}
int operator () (int a) const {std::cout<<"Degerle"<<std::endl;
return i;}
};
void constUygula(const m& v)
{
v(1);
}
void normalUygula(m& v)
{
v(1);
}
int main(int argc, char* argv[])
{
m mm;
constUygula(mm);
normalUygula(mm);
return 0;
}
/*------------------------------------------------*/
Çıktısı:
/*------------------------------------------------*/
Degerle
Referansla
/*------------------------------------------------*/
> 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
>
>
_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama