2015-04-18 2 views
-5

Я просто написал упрощенную реализацию структуры данных стека в классе, но обработка целочисленного массива ведет себя так, что я не могу понять.Обработка массивов в объявлении класса

Тот же фрагмент кода, как в push() даст поведение я ожидаю, но в этой программе, присваивающей значение в определенной позиции массива будет присвоить значение индексной переменной>

#include <iostream> 
using namespace std; 

class stack 
{ 
public: 
    stack(int size) 
    { 
     ar_size = size - 1; 
     array[ar_size]; 
     index = 0; 
    } 
    void push(int value) 
    { 
     cout << "index; " << index << endl; //will output 0 
     cout << "value: " << value << endl; //will output 8 
     array[index++] = value; 
     cout << "index; " << index << endl; //will output 8 
     cout << "value: " << value << endl; //will output 8 
     cout << "array: " << array[index] << endl; //will output what seems to be a memory address 
    } 
    int pop() 
    { 
     cout << "index; " << index << endl; //will output 8 
     return array[index--]; 
    } 
private: 
    int ar_size; 
    int array[]; 
    int index; 
}; 
int main() 
{ 
    stack tower(64); 
    tower.push(8); 
    int r = tower.pop(); 
    cout << "pop: " << r << endl; //will output what seemed to be a memory address 

    return 0; 
} 
+4

Что должно делать это утверждение: 'array [ar_size];'? У меня такое чувство, что оно не делает то, что вы думаете. –

+0

Включить предупреждения компилятора + прочитать и понять предупреждения = ПРИБЫЛЬ! –

+0

@ πάντα ῥεῖ Я вижу вашу точку зрения, у меня возникла ошибка, объявив размер массива в частном определении и в конечном итоге допустил эту ошибку. так, как и где я должен попытаться объявить размер массива? – maja

ответ

3

Вот исправленный код вашего примера:

#include <iostream> 

class stack 
{ 
public: 
    stack(int size) 
    { 
     ar_size = size - 1; 
     array = new int[size]; 
     index = 0; 
    } 
    void push(int value) 
    { 
     array[index++] = value; 
    } 
    int pop() 
    { 
     return array[--index]; 
    } 
    ~stack() 
    { 
     delete array; 
    } 
private: 
    int ar_size; 
    int *array; 
    int index; 
}; 

int main() 
{ 
    stack tower(64); 
    tower.push(8); 
    int r = tower.pop(); 
    std::cout << "pop: " << r << std::endl; //Will output 8 :) 

    return 0; 
} 

Существовали несколько проблем с этим.

  1. Как указано в комментариях, array[ar_size]; в вашем конструкторе не сделал то, что вы хотели. array[ar_size]; обращается к массиву с заданным индексом, он не выделяет вам массив. Я исправил проблему, чтобы теперь массив распределялся через new и удалялся при уничтожении стека.
  2. return array[index--]; был не совсем прав. Перед доступом к элементу вам нужно опустить индекс. return array[--index]; теперь в порядке.
  3. Вам не хватает BUNCH проверок, чтобы ваш стек не вызывал segfault или любое другое неопределенное поведение. Вам нужно проверить, можете ли вы еще нажать значения, или если вы можете поп-значения и так далее.

Надеюсь, это немного облегчит ситуацию.

+0

то, что я не мог заметить сам, заключается в том, что мне нужно использовать кучу для обработки массива между функцией класса, я изменю заголовок в соответствии с этим .. (еще слишком рано оценивать segfaults для меня). – maja

+0

Вы не обязаны использовать кучу. Но вы не можете динамически распределять память в стеке таким образом. Если вы хотите, есть [некоторые способы] (http://stackoverflow.com/questions/6335023/c-how-to-allocate-memory-dynamically-on-stack), но это намного проще. – Majster

+0

Мне нужно немного почитать, но куча кажется достаточно хорошей. Благодарю. – maja

1

Я думаю, что вы хочу array = new int[ar_size]; вместо array[ar_size];. Вам нужно будет создать деструктор, который также сделает delete [] array;.

2

Вы можете использовать динамическую память allocation.Something как этот

private: 
int ar_size; 
int *array;//pointer to array 
int index; 

, а затем в конструкторе

stack(int size) 
{ 
    ar_size = size - 1; 
    array=new int[ar_size]; 
    index = 0; 
} 

Поскольку это динамическое выделение памяти убедитесь, чтобы освободить выделенный memory.You может иметь деструктор

~stack() 
{ 
    delete[] array; 
} 

Еще один момент - после того, как вы нажмете элемент, вы увеличьте index на 1. Так что теперь индекс указывает на следующую точку вставки в стеке. Поэтому, если вы выполняете операцию pop, он удалит элемент из index, но там еще нет элемента. Таким образом, вы можете изменить свою функцию pop в

int pop() 
{ 
    cout << "index; " << index << endl; //will output 8 
    return array[--index];//now index will point to the top element 
} 
+0

Вам не хватает «удалить». Это приведет к утечке памяти. Деструктор, который будет очищать, был бы приятным. – Majster

+0

yes.missed it.Thanks for pointing it out. –

Смежные вопросы