Search code examples
c++classc++11constructorclass-members

'arr' was not declared in this scope when declaring arr in default constructor


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?


Solution

  • 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.