C++ Yıkıcı Fonksiyon İle İlgili [SORU]
-
#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
-
Konu güncel!
-
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;
} -
sayaç'ı değil SAYI değişkenini değiştirmişsin:
DENEME operator ++()
{
DENEME::sayac++;
return *this;
}
-
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.
-
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.
-
++ 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.
-
Bu açıklayıcı oldu biraz teşekküre ederim.
