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


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

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.