I am new to C++. I am trying to implement a stack. I am declaring an arr
named variable inside the default constructor.
But when I compile my code I get an error saying
'arr' was not declared in this scope
My code:
#include<iostream>
using std::cout;
using std::endl;
using std::cin;
class Stack
{
private:
int top = -1;
int n = 100;
public:
Stack()
{
int arr[n]; // 100 element stack
}
void push(int element)//push element to the top of the stack
{
if (isFull() == false)
{
// push element
top += 1; //increment top
arr[top] = element;
}
else cout << "\nStack is full! Can't push element\n";
}
void pop()
{
if (isEmpty() == false)
{
top -= 1;//decrement top
}
}
bool isEmpty()
{
if (top == -1)
return true;
else
return false;
}
bool isFull()
{
if (top == n - 1)
return true;
else
return false;
}
int peek(int position)// item at specific location
{
if (position > top)
{
cout << "\nInvalid position\n";
return -1;
}
else
{
return arr[position];
}
}
int count()// number of items
{
return top + 1;
}
void change(int position, int value) // change item at specific location
{
if (position > top)
{
cout << "\nInvalid postion\n";
}
else
{
arr[position] = value;
}
}
void display() // display elements stored
{
if (isEmpty() == false)
{
cout << endl;
for (int i = 0; i < top; i++)
{
cout << arr[i] << endl;
}
}
else
{
cout << endl << "Stack is empty! No elements to display" << endl;
}
}
};
int main()
{
Stack st;
cout << endl;
cout << st.isEmpty();
st.push(10);
cout << endl;
cout << st.isEmpty();
st.display();
return 0;
}
My error:
stack.cpp: In member function 'void Stack::push(int)':
stack.cpp:28:4: error: 'arr' was not declared in this scope
28 | arr[top] = element;
| ^~~
stack.cpp: In member function 'int Stack::peek(int)':
stack.cpp:68:11: error: 'arr' was not declared in this scope
68 | return arr[position];
| ^~~
stack.cpp: In member function 'void Stack::change(int, int)':
stack.cpp:85:4: error: 'arr' was not declared in this scope
85 | arr[position] = value;
| ^~~
stack.cpp: In member function 'void Stack::display()':
stack.cpp:96:11: error: 'arr' was not declared in this scope
96 | cout<<arr[i]<<endl;
| ^~~
I do not understand why this is happening.
Shouldn't be the arr
accessable to all member functions?
The
int arr[n]; // 100 element stack
is a local variable that exists only inside the constructor(scope). The other members will not know about this array and that is the reason for the error.
Move the array declaration to the private section and n
should be known at compile time
class Stack
{
private:
int top = -1;
static constexpr int n = 100; // n as static constexpr
int arr[n]{ 0 }; // move `arr` here and optionally initlize to `0`
public:
Stack() = default;
// ... rest of the code
};
As a side note, when you do array operations (i.e. like in push
member) do a bound check to the passed position
.