Читать «Полный справочник по С++» онлайн - страница 436

Герберт Шилдт

return 0;

}

В следующем примере с помощью объектов класса StrType по заданному имени проверяется, существует ли выполняемый модуль программы. Для этого достаточно ввести в командной строке имя файла без расширения. Затем программа повторно пытается найти выполняемый модуль, добавив к его имени расширение, и сообщает результат поиска. (Если файла нет, его невозможно открыть.) После проверки очередное расширение вычитается из имени файла, и вместо него подставляется новое. Ясность и простота этого примера, как и в предыдущем случае, обеспечивается классом StrType.

♦include “str.h"

♦include <iostream>

♦include <fstream> using namespace std;

II Расширения выполняемых файлов, char ext[3][4] = {

"EXE",

“COM",

"BAT"

int main(int argc, char *argv[])

{

StrType fname; int i ;

if(argc!=2) {

cout « "Командная строка: fname\n"; return 1;

}

fname = fname + "."; П Добавляем точку. for (i=0 ; i<3 ; i++) {

fname = fname + ext[i]; II Добавляем расширение. cout << "Проверка “ « fname « “ ifstream f(fname); if (f) {

cout « Существует\n"; f.close();

}

else cout << He существует\n0;

fname = fname - ext[i]; II Вычитаем расширение.

}

return 0;

}

Например, если программа называется isexec, и существует файл тет.ехе, командная строка isexec test выводит на экран следующие строки.

I Проверка TEST.EXE - Существует Проверка TEST.COM - Не существует Проверка TEST.ВАТ - Не существует

Следует заметить, что в этой программе конструктор ifstream использует объект класса StrType. Это возможно, поскольку в этом случае автоматически вызывается функция преобразования в тип char *. Как видим, осторожное применение возможностей языка C++ вознаграждается полной совместимостью стандартных типов и типов, разработанных пользователем.

Ш1 Принципы создания и интеграции новых типов

Как демонстрирует класс StrType, создавать и интегрировать новые типы в среду программирования довольно просто. Для этого нужно выполнить следующие действия.

1. Перегрузить все подходящие операторы, включая операции ввода-вывода.

2. Определить все подходящие функции преобразования.

3. Предусмотреть конструкторы, позволяющие легко создавать объекты в разнообразных ситуациях.

Одним из основных преимуществ языка C++ является его расширяемость. Не следует пренебрегать такой возможностью.

Ш Проблема

Существует одна весьма интересная проблема. Попробуйте реализовать класс StrType, используя стандартную библиотеку. Иначе говоря, для хранения символов следует применить не строку, а контейнер. Вместо указателей и функций примените для работы со строками итераторы и алгоритмы.

Полный справочник по

Глава 40

Синтаксический анализ выражений

^ есмотря на то что стандарт языка C++ довольно обширен, некоторые темы в нем не рассмотрены. В данной главе мы изучим одну из них: синтаксический анализ выражений. Программы синтаксического анализа используются для вычисления алгебраических выражений, например (10—8)*3. Они довольно полезны и применяются во многих приложениях. В то же время синтаксические анализаторы окружены ореолом таинственности. По разным причинам процедуры, использующиеся в процессе синтаксического разбора, остаются достоянием избранных. Действительно многие достаточно умудренные опытом программисты пасуют перед процессом синтаксического анализа выражений.