Проблема в том, что вы не хотите перераспределять вершину стека. Скорее, вы хотите выделить новый массив значений, который достаточно велик для хранения новых значений. Кроме того, поскольку вам нужно перераспределить массив, values
должен быть указателем.
Но как насчет того, чтобы мы все это забыли? Если мы работаем в c ++, давайте использовать то, что c ++ предлагает нам, чтобы сделать нашу жизнь проще. После того, как это будет сделано, попробуйте открыть вещи, если вы действительно чувствуете необходимость.
Одна из вещей, о которых я говорю, это использование calloc
. Использование calloc
- это плохая идея, особенно при использовании шаблонов. Проблема в том, что, поскольку calloc
не имеет информации о типе, он не будет выполнять что-то столь же основное, как вызов конструктора. Конструкторы очень важны в ООП, поскольку они гарантируют неизменность объекта при его создании. Вместо этого используйте ключевое слово new[]
, например
values = new T[STACKMAX];
Это выделяет массив T
длиной STACKMAX
. Конечно, как указывает Грег, вам следует пересмотреть использование STACKMAX
и использовать вместо него переменную. Кроме того, values
не должен быть статическим массивом, а должен иметь тип T*
.
Еще одна вещь, о которой я говорил, это то, что вы действительно пытаетесь реализовать массив, который динамически увеличивается по мере необходимости. В c ++ мы называем такую структуру vector
. Если вы используете вектор, весь ваш код уменьшается до
#include<iostream>
#include<vector>
using namespace std;
template<class T> class StackTemplated {
private:
std::vector<T> vec;
public:
StackTemplated() { } // the constructor is trivial; in fact, you can leave it out if you want
void push(T i);
T pop(void);
bool empty(void);
};
template<class T>
void StackTemplated<T>::push(T i) {
vec.push_back(i);
}
template<class T>
T StackTemplate<T>::pop(void) {
T top = vec.back();
vec.pop_back();
return top;
}
template<class T>
bool StackTemplate<T>::isEmpty(void) {
return vec.size() == 0;
}
Вот и все. Это намного менее сложно, если вы можете использовать существующую структуру данных для реализации новой структуры данных.
Как только вы действительно освоитесь с тем, как работает vector
(и в Интернете есть множество объяснений / документации), , а затем попробуйте реализовать эту функцию самостоятельно. Суть в том, что реализовать структуру данных намного проще, если вы точно знаете, как она должна себя вести.