2016-03-26 20 views
2

C++ 'da yapıcılar kullanarak yığınları uygulamaya çalışıyorum. Yığında bir elemanı itmek için harici bir işlev kullanmam gerekiyor, ancak düzgün çalışmıyor gibi görünüyor. Psikheeksüel fonksiyon, itme fonksiyonunu "girer" gibi görünür, fakat ind değerini artırmaz, bu yüzden yığının üzerine yeni bir eleman eklemez (örneğin, kodumda, tüm pushxternals, üzerine bir değer atmaya çalışacaktır) aynı indeks, s.push - ind == 2 tarafından kullanılan sonuncu. Neyi yanlış yaptığımı bilmiyorum.Dış işlev kullanarak yığın itme

Oh, sadece sınıf kodunu değiştirmem gerekiyor - pushexternal ve main değişmeden kalmalıdır.

#include <iostream> 
using namespace std; 

class Stack { 
    public: 
    int ind; 
    int * arr; 

Stack() 
{ 
    arr = new int[25]; 
    ind = -1; 
} 
~Stack() 
{ 
    delete [] arr; 
} 

void push(int val) 
{ 
    arr[++ind] = val; 
    cout << "Added " << arr[ind] << " to " << ind << endl; 
} 

void top() 
{ 
    cout << "Last: " << arr[ind]; 
} 
}; 

void pushexternal(Stack s, int a) { 
    s.push(a); 
} 

int main() { 
    Stack s; 
    s.push(0); 
    s.push(1); 
    s.push(2); 
    pushexternal(s, 3); 
    pushexternal(s, 4); 
    pushexternal(s, 5); 
    return 0; 
} 

Sonuçlar:

Added 0 to 0 
Added 1 to 1 
Added 2 to 2 
Added 3 to 3 
Added 4 to 3 
Added 5 to 3 
Top: 2 

cevap

2
void pushexternal(Stack s, int a) { 
    s.push(a); 
} 

sizin nesnenin bir kopyası olan bir nesneyi alır anlamına gelen bir parametre olarak bir Yığını alır.

Kaynaklarda çalışmanız gerekir; bu şekilde, işlenecek nesnenin bir kopyasını göndermeyeceğiniz, ancak nesnenin başvurusu gönderilmeyecek, böylece orijinal nesne işlenecektir.

+0

Teşekkür ederim, referansla düzgün şekilde çalışıyor. Ancak, bu, pushexternal fonksiyonu değiştirmemizi gerektirir (void pushexternal (Stack & s, int a)). Bu görevde kullandığım kitap, pushexternal ve ana işlevlerin değişmemesini ve sadece sınıfımın kodunu değiştirmemi istiyor. Henüz denemediğimden emin değilim, ama bu durumda bir kopya oluşturucu yardımı mı kullanacak? – drakerc

+0

Bir kopya oluşturucu, bir nesneyi mevcut bir nesneden gelen verilerle başlatmak için kullanılır. Bu, fonksiyonunuzun Stack fonksiyon parametresinden aldığı ve üzerinde çalıştığı için size yardımcı olmaz. Tahminim, örnek yanlış ya da kitap "hata" yı bulmanızı istiyor. – Aleksandar

1
void pushexternal(Stack s, int a) { 
    s.push(a); 
} 

Sen referans ile bu değer bu işleve Stack nesne geçmektedir. Bu, orijinal Stack nesnesinin geçici bir kopyasını oluşturur, böylece orijinal nesne değişmeden kalır. RAII ilkesi ihlal edildiğinden bunun bellek bozulmasına yol açacağından bahsetmeyin.

Sadece beraberlik şansından, sanırım, kodunuz segfaulting değil.