Как реализовать функции push и pop в стеке при наличии постоянных переменных (ошибка компиляции) - PullRequest
0 голосов
/ 16 марта 2019

Я делаю класс для стека для присваивания, но некоторые переменные должны быть константными. Видимо, это вызывает ошибку, потому что, когда мне приходится делать функции push и pop из-за переменных const. Есть идеи как это исправить? Ошибка: In member function 'void stack<T>::push(const T&) const': error: increment of read-only location '((const stack<T>*)this)->stack<T>::top' (та же ошибка для функции pop).

#include <iostream>
using namespace std;
template <typename T>
class stack{
public:
stack(int s){
  capacity = s;
  data = new T[capacity];
  top = 0;
}
stack(const stack &s){
  top=s.top;
  for(int j=1;j<=s.top;j++){
    data[j]=s.data[j];
  }
  capacity=s.capacity;
} ;
~stack(){
  delete []data;
} ;
const stack & operator = (const stack &s){
  delete []data;
  capacity=s.capacity;
  top=s.top;
  data= new T[capacity];
  for(int i=1;i<=s.top;i++){
    data[i]=s.data[i];
  }
}; 

bool empty() const {

  return top==0;
};
void push(const T &x) const{
 T y = *x;
  data[top++]=y;
};
T pop() const{

  return data[--top];
};
int size() const{
  return top;
};
friend ostream& operator<< (ostream& out,const stack& s){
  while(s.empty()!=1){
    out<<s.pop();
  }
    private:
 int capacity;
T *data;
int top;
};

1 Ответ

2 голосов
/ 16 марта 2019

Просто удалите const из декларации push и pop.

void push(const T &x) {

not

void push(const T &x) const{

Ключевое слово const для метода предназначено для методов, которые не изменяют состояние объекта.Это не относится к push и pop, они меняют стек.

Это не то же самое, что const T& x.Объект x не изменяется, будучи помещенным в стек.Таким образом, это может быть объявлено const.

ОБНОВЛЕНИЕ

Другая постоянная ошибка здесь

friend ostream& operator<< (ostream& out,const stack& s){
    while(s.empty()!=1)
       out<<s.pop();
}

operator<< должен выводить стек, он не должен изменятьсястек (очевидно).Стек s был объявлен как const в operator<<, так что это хорошо.Но теперь посмотрим, что делает operator<<.Он вызывает pop , поэтому он меняет стек .Это неправильно в принципе (потому что логически operator<< не должно изменять выводимый стек), и это неправильно в C ++, потому что стек s объявлен как const.

Так что переписайте operator<<, чтобы он неизменить стекЧто-то более или менее подобное

friend ostream& operator<< (ostream& out,const stack& s) {
   for (int i = 0; i < s.top; ++i)
       out << s.data[i] << ' ';
   return out;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...