Не могу взаимодействовать с переменными в классе, С++
Суть такова. Есть класс Stack, в котором будет простая реализация стека. Создаю экземпляр этого класса в main и вызываю методы из этого класса. В самом же классе есть конструктор по умолчанию, который создает две переменные. Одна из них - p_Stack, ссылка на массив (создаю его динамическим, ибо стек), вторая - lenght, длина массива. На 16 строке выдает ошибку, т.к. не видит переменную lenght. Почему я не могу в самом классе взаимодействовать с этими переменными? Если передавать их в класс, а не создавать в нем, то всё работает окей, но тогда теряется сам смысл такого построения кода. Работаю в Visual Studio 2019. Создал проект как консольное приложение.
#include <iostream>
class Stack
{
public:
Stack()
{
int lenght = 0;
int* p_Stack = new int[lenght];
}
void push(int n)
{
std::cout << "Number to push: " << '\n';
std::cin >> n;
lenght++;
}
};
int main()
{
Stack s;
int n;
start:
std::cout << "1 - Push" << '\n';
//std::cout << "2 - Pop" << '\n';
std::cin >> n;
switch (n)
{
case 1:
s.push(n);
goto start;
}
}
Ответы (1 шт):
Все правильно.
Когда Вы объявляете две переменные int lenght и int* p_Stack в конструкторе- это локальные переменные, котрые существуют внутри блока, и имеют смысл только во время работы конструктора.
Чтобы они существовали во время существования экземпляра класса, нужно вынести их за пределы блока, то есть объявить "снаружи конструтора, глобально для экземпляра класса", примерно так:
#include <iostream>
class Stack
{
private:
int lenght;
int* p_Stack;
public:
Stack()
{
lenght = 0;
p_Stack = new int[lenght];
}
void push(int n)
{
std::cout << "Number to push: " << '\n';
std::cin >> n;
lenght++;
}
};
int main()
{
Stack s;
int n;
start:
std::cout << "1 - Push" << '\n';
//std::cout << "2 - Pop" << '\n';
std::cin >> n;
switch (n)
{
case 1:
s.push(n);
goto start;
}
}
Точнее, писать private: в начале не обязательно, потому что объявленные переменные по умолчанию private для класса ( и public для стуктуры ).
Можно еще следовать хорошим практикам, и заменить присваивание внутри тела конструктора инициализацией, для которой есть примерно такой синтаксис:
class Stack
{
private:
int lenght;
int* p_Stack;
public:
Stack() : lenght(0)
{
p_Stack = new int[lenght];
}
Ну, и хорошо бы поменять функцию main, предусмотреть вариант завершения программы