Программирование. Принципы и практика использования C++ Исправленное издание, стр. 89
// ...ts.putback(t); // возвращает объект t класса Token обратно в объект tsЭто все, что нам нужно, чтобы закончить разработку калькулятора.
6.8.1. Реализация класса Token_stream
Теперь необходимо реализовать три функции класса
Token_streamToken_streamToken_streamToken_streamTokenclass Token_stream {public: Token_stream(); // создает объект класса Token_stream, // считывающий данные из потока cin Token get(); // получает объект класса Token // (функция get() определена в разделе 6.8.2) void putback(Token t); // возвращает объект класса Token // обратноprivate: bool full; // находится ли в буфере объект класса Token? Token buffer; // здесь хранится объект класса Token, // возвращаемый в поток функцией putback()};Теперь можно определить (написать) три функции-члена. Конструктор и функция
putback()Token_stream::Token_stream() :full(false), buffer(0) // в буфере нет ни одного объекта // класса Token{}Определяя функцию-член вне определения самого класса, мы должны указать, какому классу она принадлежит. Для этого используется обозначение
имя_класса::имя_функции_членаToken_streamПочему мы определяем функцию-член вне определения класса? Ответ очевиден: определение класса (в основном) описывает, что класс может делать. Определения функций-членов представляют собой реализации, которые уточняют, как именно класс выполняет то, для чего он предназначен. Мы предпочитаем размещать эти детали там, где они не отвлекают внимание от главного. В идеале на экране должна отразиться каждая логическая единица программы. Определение класса обычно удовлетворяет этому требованию, если его функции-члены определены в другом месте, а не в классе.
Члены класса инициализированы в списке инициализации (см. раздел 6.3.3); выражение
full(false)Token_streamfullfalsebuffer(0)bufferTokenTokenToken_stream::bufferФункция-член
putback()Token_streamvoid Token_stream::putback(Token t){ buffer = t; // копируем объект t в буфер full = true; // теперь буфер полон}Ключевое слово
voidputback()get()void Token_stream::putback(Token t){ if (full) error("putback() в полный буфер"); buffer = t; // копируем объект t в буфер full = true; // буфер теперь полон}Проверка переменной
fullToken6.8.2. Считывание лексем
Всю реальную работу выполняет функция
get()Token_stream::bufferTokenget()cinTokenToken Token_stream::get(){ if (full) { // если в буфере есть лексема, // удаляем ее оттуда full=false; return buffer; } char ch; cin >> ch; // обратите внимание на то, что оператор >> // пропускает разделители (пробелы, символы перехода