'arr' не был объявлен в этой области при объявлении arr в конструкторе по умолчанию - PullRequest
2 голосов
/ 05 августа 2020

Я новичок в C ++. Я пытаюсь реализовать стек 1002 *. Я объявляю именованную переменную arr внутри конструктора по умолчанию .

Но когда я компилирую свой код, я получаю сообщение об ошибке:

'arr' was not declared in this scope

Мой код:

#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;
}

Моя ошибка:

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;
      |           ^~~

Я не понимаю, почему это происходит.

Разве arr не должен быть доступен для всех функций-членов?

Ответы [ 2 ]

5 голосов
/ 05 августа 2020

int arr[n]; // 100 element stack 

- это локальная переменная, которая существует только внутри конструктора (области видимости). Другие члены не будут знать об этом массиве, и это является причиной ошибки.

Переместите объявление массива в частный раздел, и n должно быть известно во время компиляции

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

};

В качестве примечания, когда вы выполняете операции с массивом (например, как в члене push), выполняйте проверку привязки к переданному position.

0 голосов
/ 05 августа 2020

Это потому, что arr не является членом класса, а только локальной переменной, определенной в конструкторе. Он исчезает вместе с концом области действия конструктора.

Начните свой класс следующим образом:

class Stack
{
  int top = -1;
  static int const n = 100;
  int arr[n]; // 100 element stack                                                                                                                    

public:
  Stack() {}
  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...