2016-03-26 2 views
2

Я пытаюсь реализовать стеки с использованием конструкторов в C++. Я должен использовать внешнюю функцию для вставки элемента в стек, однако он не работает должным образом. Функция pushexternal, кажется, «вводит» функцию push, но не увеличивает значение ind, поэтому она не добавляет новый элемент в стек (например, в моем коде все pushxternals будут пытаться нажать значение на тот же самый индекс, последний из которых используется s.push - ind == 2). Я не уверен, что я делаю неправильно.Stack push using external function

О, я должен только модифицировать код класса - pushexternal и main должны оставаться неизменными.

#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; 
} 

Результаты:

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 

ответ

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

получает стек в качестве параметра, который означает, что он получает объект, который является копией вашего объекта.

Вы должны работать со ссылками, таким образом, вы не будете отправлять копию объекта, который будет обрабатываться, но будет обрабатываться ссылка на объект, поэтому исходный объект будет обработан.

+0

Благодарю вас, прохождение по ссылке работает правильно. Однако он требует от меня изменить функцию pushexternal (void pushexternal (Stack & s, int a)). В этой задаче книга, которую я использую, требует, чтобы я оставил pushexternal и основные функции неизменными и менял только код моего класса. Я не уверен, как я еще не пробовал, но использовал бы помощь с копировальным конструктором в этом случае? – drakerc

+0

Конструктор копирования используется для инициализации объекта данными из уже существующего объекта. Это не поможет вам, так как ваша функция берет Stack из параметра функции и работает на нем. Я предполагаю, что пример неверен или книга хочет, чтобы вы нашли «ошибку». – Aleksandar

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

Вы пропускание Stack объекта в эту функцию по значению, а не по ссылке. Это делает временную копию исходного объекта Stack, поэтому исходный объект остается неизменным. Не говоря уже о том, что это приведет к повреждению памяти, поскольку нарушен принцип RAII.

Как раз на удачу, я думаю, ваш код не является непоправимым.