folder Tahribat.com Forumları
linefolder C - C++
linefolder C++ Yıkıcı Fonksiyon İle İlgili [SORU]



C++ Yıkıcı Fonksiyon İle İlgili [SORU]

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    #include <iostream>
    #include <conio.h>

    using namespace std;

    class DENEME
    {
    private:
        __int64 SAYI;
    public:
        static int sayac;
        DENEME():SAYI(0)
        {
            ++sayac;
        }
        ~DENEME()
        {
            --sayac;
        }
        DENEME operator ++()
        {   
            DENEME gecici;
            ++SAYI;
            gecici.SAYI=SAYI;
            return gecici;
        }
        void yazdir()
        {
            cout << endl << SAYI;
        }

    };

    int DENEME::sayac=0;

    void test(void)
    {
        DENEME c;
        cout << "\nSayac su an:" << c.sayac;
        getch();
    }

    int main()
    {
        DENEME a,b;
       
        ++a;
        ++b;
        a=++b;
        cout << endl << "Sayac su an:" << a.sayac;
        test();
        cout << endl << "Sayac su an:"<
        getch();
        return 0;
    }

     

     

    Sorumu anlayabilmeniz için DENEME nesnesinin ne işe yaradığınıda iyi bilmeniz gerekmektedir. (Hoş bir işe yaramasada)

     

    Şimdi bu programın mantıken çıktısı şu şekilde olması lazım:

    --------------
    Sayac su an:2
    Sayac su an:3
    Sayac su an:2

    --------------

    Ancak programın çıktısı şu şekilde:

    --------------

    Sayac su an:-1
    Sayac su an:0
    Sayac su an:-1

    --------------

    Programın normal şekilde çalışmasını sağlamam için aşağıdaki kod satırını main kod bloğunda çalıştırmam gerekiyor.

    -------------------- 

        DENEME a,b;
       
        /*++a;
        ++b;
        a=++b;*/
        cout << endl << "Sayac su an:" << a.sayac;
        test();
        cout << endl << "Sayac su an:" << a.sayac;
        getch();
        return 0;

    --------------------

     

    Programın yanlış çalışma sebebi.

        ++a;
        ++b;
        a=++b;

    Bu kodların çalıştırdığı operatör overloaded fonksiyonu çalıştırması;

    Operatöre Aşırı yükleme yaptığım fonksiyondan sonra (gecici adlı nesne isini bitirdikten sonra)

        DENEME operator ++()
        {   
            DENEME gecici;
            ++SAYI;
            gecici.SAYI=SAYI;
            return gecici;
        }

    Bu fonksiyon 2 kere çalışıyor

        ~DENEME()
        {
            --sayac;
        }

     

     

    Denediğim Ortamlar:

    Visual Studio 2008 ve Embarcadero 2010 Rad Studio

    İkisindede aynı sorunu yaşıyorum.

    Sebepleri, çözüm önerileriniz, ve konu hakkında fikirlerinizi almak istiyorum.

     

    Saygılar


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    Konu güncel!


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    inside
    anonim6918524
    anonim6918524's avatar
    Banlanmış Üye
    Bilgi/Destek Madalyası Üstün Hizmet Madalyası
    Kayıt Tarihi: 16/Temmuz/2005
    Erkek

    Nesne adresiyle ilgili sıkıntı var hoca. Koddaki operator overload kullanımı doğru değil. Şu şekilde olması gerek.

    DENEME & operator ++() 

        SAYI++; 
        return *this; 
     


    λ
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    CHaRMaNDeR
    CHaRMaNDeR's avatar
    Kayıt Tarihi: 05/Nisan/2003
    Erkek

    sayaç'ı değil SAYI değişkenini değiştirmişsin:

     

        DENEME operator ++()

        {    

            DENEME::sayac++;

            return *this;

        }


    Düşünüyorum, o halde varım.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    inside
    anonim6918524
    anonim6918524's avatar
    Banlanmış Üye
    Bilgi/Destek Madalyası Üstün Hizmet Madalyası
    Kayıt Tarihi: 16/Temmuz/2005
    Erkek

    CHaRMaNDeR bunu yazdı:
    -----------------------------

    sayaç'ı değil SAYI değişkenini değiştirmişsin:

     

     

        DENEME operator ++()

        {    

            DENEME::sayac++;

            return *this;

        }

     


    -----------------------------

     

    Orayla alakası yok. Adam ++ ile sayı değişkenini arttırıyor. Constructor ile sayaç arttırılmış zaten. Orda belirttiğim üzere adres konusunda sıkıntı var. Diğer türlü destructor her seferinde tetikleniyor ve sen suni bir şekilde, düşen değeri tekrar overloaded fonksiyon ile arttırıyorsun. Öyle de çalışıyor gibi gözükse de doğru bir yöntem değil.


    λ
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    Hocam nesnenin kendisini referans olarak döndürmeyi düşündüm zaten çalıştırmıştımda. Benim asıl sorunum kendi yazdığım:

        DENEME operator ++()
        {   
            DENEME gecici;
            ++SAYI;
            gecici.SAYI=SAYI;
            return gecici;
        }

    fonsiyondaki hatanın sebebi ne? Ben hata göremiyorum yada yanlış kullanım?

     


    "Senin problem ++ yı overload ettiğnde "yanlış kullanımdan" "nesne adresine erişimdn" doğn sıkıntıdan kaynaklanıyor."

     

    Biraz daha ayrıntıya inersen sevinirim hocam. Koddaki yanlış kullanımı anlayamadım zira :S

     

    Teşekkürler.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    inside
    anonim6918524
    anonim6918524's avatar
    Banlanmış Üye
    Bilgi/Destek Madalyası Üstün Hizmet Madalyası
    Kayıt Tarihi: 16/Temmuz/2005
    Erkek

    ++ ile nesnedeki sayıyı arttırırken geçici bir nesne yaratmışsın ve o nesnenin kendisini döndürmüşsün. Bu yarattığın geçici nesne senin yarattığın nesnenin adresine yazıyor ve nesne yok olduğu için destructor devreye giriyor. 


    λ
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    Bu açıklayıcı oldu biraz teşekküre ederim.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
Toplam Hit: 1914 Toplam Mesaj: 8