2016-04-10 28 views
0

Bu kod çalıştığından bir C++ sorun (veya orada yok) karşılaşıyorum, ancak nedenini bilmiyorum.C++ içinde yerel bir değişken döndürüyor

Bağlam için, profesörüm bize bir başlık dosyası verdi ve ana işlev, program bir Fibonnaci Sırası oluşturur.

Diziyi, ++ a ve a ++ kullanarak yinelemek için bir yineleyici kullanıyorum.

İşte benim için bir ++ uygulaması var.

FibonacciIterator FibonacciIterator::operator++(int) //i++, increment i, return old i. 
{ 
    FibonacciIterator old = *this; //create old object to return 

    //increment actual fibonacci sequence 
    long nextTemp = fCurrent + fPrevious; 
    fPrevious = fCurrent; 
    fCurrent = nextTemp; 

    fCurrentN++; //increment count 
    return old; 
} 

Şimdi, pointer 'bu' ait KQUEUE operatörünü kullanarak, 'eski' bir değer yaratmak. Geçerli yineleyiciye biraz mantık yapıyorum ve eski yineleyiciyi döndürüyorum.

Bu tüm inşaat ve döngü do-while aşağıdakileri kullanarak:

FibonacciIterator lIterator2 = lIterator.begin(); 
do 
{ 
    cout << *lIterator2++ << endl; 
} while (lIterator2 != lIterator2.end()); 

her şey çalışıyor. Bu do-while döngüsü profesör tarafından yazılır, biz onu değiştirmek niyetinde değiliz.

Sorum şu, bu kod neden çalışıyor? Anlayışımda, bir yöntemde yerel bir değişken oluşturduğumuzda, bu değişken yöntem yığını çerçevesinde korunur. Yığın çerçevesinden çıktığımızda, o yığın çerçevesinde oluşturulan yerel bir değişkeni döndürmeliyiz, değerinizi alabiliriz. Ayrıca olmayabiliriz. Anlayışımın nedeni, bu değişkenin oluşturulduğu bellek konumunun, bilgisayarda ihtiyaç duyabilecek herhangi bir program tarafından "kapmak için" kalmasıdır. Yani istediğimiz değeri alırsak, bunun hiçbir şey üzerine yazılmadığı için. Eğer yapmazsak, onun bir şey üzerine yazdığı için.

Peki neden bu kod çalışıyor, zamanın% 100'ü? Neden SOMETIMES'in eski olduğunu görmek için çöp alıyorum ve programımı işlenmemiş bir istisna ile çarpıyorum? Tek düşüncem şudur: 'FibonacciIterator' kullanıcı tarafından oluşturulan bir sınıftır, OTOMATİK OLARAK bellekte ayrılmış bellek vardır, bu nedenle bu problemle karşılaşmazız. Tek düşüncem bu sorunun yalnızca int, long, double, vb gibi türleri kullanarak var olması olabilir.

Ancak, tahminimin yanlış olduğunu% 99 eminim ve burada neler olduğunu anlamak istiyorum. . Bunu anlamak istiyorum çünkü bir tane için C++ 'ya hoşlanıyorum ama neden bir şeyler çalıştığını bilmekten zevk alamıyorum.

Teşekkür ederiz!

+0

(kopya "güvenli" olması gerektiğini tüm uyarılar ile) Tamam, bu nedenle kopyalanır ve Bu durumda döndürülen sonuç, söz konusu Bildirimin sonlanan noktalı virgülüne (;) kadar kapsamı olan geçici bir nesne içinde depolanır. yani döndürülmüş değer, cout << * lIterator2 ++ << endl'in sonlanan noktalı virgülüne kadar bir kapsama sahiptir; –

cevap

2

Yerel bir nesneyi döndürebilirsiniz - kopyalanacak. İşaretçiyi yerel bir nesneye geri dönemezsiniz. Doğru şekilde işaret ettiğinizde, işaretçi önemsiz yere işaret edecektir. Senin durumunda

Bir kopya var ve bu yüzden yerel değişken değeri tarafından döndürülen

+0

Bu durumda taşıma ile ilgili bilgileri değiştirebilirim (C++ 11 ve FibonacciIterator’ın doğru hareket davranışı varsayılarak) – Zereges