Цепочка вызовов

319
30 января 2017, 18:17

Здравствуйте. На данный момент я нахожусь на начальном этапе изучения C++, поэтому хотел бы задать вопрос более опытным. Я написал простенькую консольную программу и попытался реализовать элементарный диалог с пользователем посредствам создания специального метода в одном из классов :

class MyClass {
public :
   void method() { cout << endl << "Method used" << endl; }
   void menu() {
       int* choice = new int;
       cout << "1. Use method;" << endl << "2. Stop;" << endl << "set : ";
       cin >> *choice;
       switch(*choice) {
           case 1 : delete choice; method(); menu(); break;
           case 2 : delete choice; exit(1); break;
       }
   }
};

В действительности он немного побольше, но концепция такая же. Вот собственно хотел спросить по поводу применения данного принципа : нормально так делать? В смысле, меня немного беспокоит что каждый новый вход в метод menu() после ввода "1" будет приостанавливать действующий вызов. Следовательно, если так долго продолжать то получится довольно длинная цепочка приостановленных вызовов.

Или же целесообразней вынести всё это безобразие, к примеру, в main() ? :

int main() {
   MyClass* my_obj = new MyClass;
   int* choice = new int;
   while(true) {
       cout << "1. Use method;" << endl << "2. Stop;" << endl << "set : ";
       cin >> *choice;
       switch(*choice) {
           case 1 : my_obj->method(); break;
           case 2 : delete choice; delete my_obj; exit(1); break;
       }
   }
   return 0;
}

При использовании метода menu(), равно как и main(), освобождается вся выделенная память. Однако, остается длинный хвост приостановленных вызовов. Может ли такая цепочка, например, рано или поздно занять много памяти или типа того? В общем, хотелось бы получить аргументированный ответ, спасибо =)

Answer 1

Ну, реально вы будете очень долго вызывать menu(), пока исчерпается стек, но просто зачем так поступать? можно приобрести плохую привычку :) - тем более, что вы совершенно корректно написали второй пример.

У меня только два замечания:
1. совершенно незачем делать choice указателем и выделять для него память. Лучше сделать его простой переменной int. Конечно, если это просто для тренировки, то ладно :)
2. exit(1) - не лучший способ выхода, тем более что ненулевой код свидетельствует обычно о какой-то ошибке. Просто выходите из main() - этого достаточно. И, кстати, break после exit(1) можно не писать. Надеюсь, понятно, почему? :)

READ ALSO
Как считать данные с консоли?

Как считать данные с консоли?

Например, я пишу 'std::cout << 5'Как мне потом это значение считать с консоли? Upd: не самому вводить, а считать то, что уже вывело

364
Задачники по C++ [требует правки]

Задачники по C++ [требует правки]

Посоветуйте несколько книг для практики по основам языка программирования на C++Это могут быть как справочные пособия, так и какие-нибудь...

337
Обработка ошибок в методе класса

Обработка ошибок в методе класса

Предположим, есть класс для работы с базой данныйЕсть методы этого класса, которые обрабатывает возможные ошибки через if, записывая текст...

319
&#39;cout &lt;&lt; &hellip;&#39; или &#39;cout.put(&hellip;)&#39;?

'cout << …' или 'cout.put(…)'?

Что лучше использовать для вывода на консоль символов: 'cout <<

353