Программирование >>  Инициализация объектов класса, структура 

1 ... 116 117 118 [ 119 ] 120 121 122 ... 395


демонстрация обработки параметров в командной строке:

argc: 8

argv[ 1 ]: -d

встретился -

встретилась -d: отладочная печать включена

argv[ 2 ]: -l

встретился -

встретилась -l: ограничение ресурса

argv[ 3 ]: 1024

default: параметр без дефиса: 1024

argv[ 4 ]: -o

встретился -

встретилась -o: вхходной файл argv[ 5 ]: test 7 8

default: параметр без дефиса: test 7 8 argv[ 6 ]: chapter7.doc

default: параметр без дефиса: chapter7.doc argv[ 7 ]: chapter8.doc

default: параметр без дефиса: chapter8.doc Заданное пользователем значение limit: 1024 Заданнтй пользователем вхходной файл: test 7 8 Файлы, подлежащий(е) обработке:

chapter7.doc

chapter8.doc

7.8.1. Класс для обработки параметров командной строки

Чтобы не перегружать функцию main() деталями, касающимися обработки параметров командной строки, лучше отделить этот фрагмент. Можно написать для этого функцию.

extern int parse options( int arg count, char *arg vector ); int main( int argc, char *argv[] ) {

...

int option status;

option status = parse options( argc, argv );

...

Например:

Как вернуть несколько значений? Обычно для этого используются глобальные объекты, которые не передаются ни в функцию для их обработки, ни обратно. Альтернативной стратегией является инкапсуляция обработки параметров командной строки в класс.

Данные-члены класса представляют собой параметры, заданные пользователем в командной строке. Набор открыт1х встроенных функций-членов позволяет получать их значения. Конструктор инициализирует параметры значениями по умолчанию. Функция-член получает argc и argv в качестве аргументов и обрабатывает их:

a.out -d -l 1024 -o test 7 8 chapter7.doc chapters.doc Вот трассировка обработки параметров командной строки:



#include <vector> #include <string>

class CommandOpt {

public:

ComandOpt() : limit( -1 ), debug on( false ) {} int parse options( int argc, char *argv[] );

string out file() { return out file; } bool debug on() { return debug on; } int files() { return file names.size(); }

strings operator[]( int ix );

private:

inline void usage( int exit value = 0 );

bool debug on; int limit; string out file; vector<string> file names;

static const char *const program name; static const char *const program version;

#include CommandOpt.h

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

...

ComandOpt com opt; int option status;

opttion status = com opt. parse options (argc, argv);

...

Так выглядит модифицированная функция miain() :18

Упражнение 7.15

Добавьте обработку опций -t (включение таймера) и -b (задание размера буфера bufsize). Не забудьте обновить usage(). Например:

prog -t -b 512 dataO Упражнение 7.16

Наша реализация не обрабатывает случая, когда между опцией и ассоциированным с ней значением нет пробела. Модифицируйте программу для поддержки такой обработки.

Упражнение 7.17

Наша реализация не может различить лишний пробел между дефисом и опцией:

18 Полный текст реализации класса CommandOpt можно найти на Web-сайте издательства Addison-Wesley.



7.9. Указатели на функции

Предположим, что нам нужно написать функцию сортировки, вызов которой выглядит так:

sort( start, end, compare );

где start и end являются указателями на элементы массива строк. Функция sort() сортирует элементы между start и end, а аргумент compare задает операцию сравнения двух строк этого массива.

Какую реализацию выбрать для compare? Мы можем сортировать строки лексикографически, т.е. в том порядке, в котором слова располагаются в словаре, или по длине - более короткие идут раньше более длинных. Нам нужен механизм для задания альтернативных операций сравнения.

(Заметим, что в главе 12 описан алгоритм sort() и другие обобщенные алгоритмы из стандартной библиотеки С++. В этом разделе мы покажем свою собственную версию sort() как пример употребления указателей на функции. Наша функция будет упрощенным вариантом стандартного алгоритма.)

Один из способов удовлетворить наши потребности - использовать в качестве третьего аргумента compare указатель на функцию, применяемую для сравнения.

Для того чтобы упростить использование функции sort() , не жертвуя гибкостью, можно задать операцию сравнению по умолчанию, подходящую для большинства случаев. Предположим, что чаще всего нам требуется лексикографическая сортировка, поэтому в качестве такой операции возьмем функцию compare() для строк (эта функция впервые встретилась в разделе 6.10).

prog - d dataO

Модифицируйте программу так, чтобы она распознавала подобную ошибку и сообщала о ней.

Упражнение 7.18

В нашей программе не предусмотрен случай, когда опции -l или -o задаются несколько раз. Реализуйте такую возможность. Какова должна быть стратегия при разрешении конфликта?

Упражнение 7.19

В нашей реализации задание неизвестной опции приводит к фатальной ошибке. Как вы думаете, это оправдано? Предложите другое поведение.

Упражнение 7.20

Добавьте поддержку опций, начинающихся со знака плюс (+), обеспечив обработку +s и +pt, а также +sp и +ps. Предположим, что +s включает строгую проверку синтаксиса, а +p допускает использование устаревших конструкций. Например:

prog +s +p -d -b 1024 dataO



1 ... 116 117 118 [ 119 ] 120 121 122 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика