Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
292 0 18:03, 26-08-2023Книга Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читать онлайн бесплатно без регистрации
Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».
:Widget(xy,w,h,s,0) { }
void put(int);
void put(const string&);
void attach(Window& win);
};
Объект класса In_box может принимать текст, набранный в нем, и мы можем прочитать этот текст в виде строки с помощью функции get_string() или как целое число с помощью функции get_int(). Если хотите убедиться, что текст был введен, то можете прочитать его с помощью функции get_string() и проверить, не пустая ли эта строка.
string s = some_inbox.get_string();
if (s =="") {
// текст не введен
}
Объект класса Out_box используется для выдачи сообщений, адресованных пользователю. По аналогии с классом In_box, мы можем с помощью функции put() ввести либо целые числа, либо строки. Примеры использования классов In_box and Out_box приведены в разделе 16.5.
Мы могли бы предусмотреть функции get_floating_point(), get_complex() и так далее, но не сделали этого, так как вы можете взять строку, поместить ее в поток stringstream и форматировать ввод, как захотите (см. раздел 11.4).
16.4.4. Класс Menu
Определяем очень простое меню.
struct Menu:Widget {
enum Kind { horizontal, vertical };
Menu(Point xy, int w, int h, Kind kk, const string& label);
Vector_ref<Button> selection;
Kind k;
int offset;
int attach(Button& b); // связывает кнопку с меню
int attach(Button* p); // добавляет новую кнопку в меню
void show() // показывает все кнопки
{
for (int i = 0; i<selection.size(); ++i)
selection[i].show();
}
void hide(); // hide all buttons
void move(int dx, int dy); // перемещает все кнопки
void attach(Window& win); // связывает все кнопки с объектом win
};
По существу, объект класса Menu — это вектор кнопок. Как обычно, объект Point xy задает координаты левого верхнего угла. Ширина и высота используются для изменения размера кнопки при ее добавлении в меню. Примеры описаны в разделах 16.5 и 16.7. Каждая кнопка меню (пункт меню) — это независимый объект класса Widget, переданный объекту класса Menu как аргумент функции attach(). В свою очередь, класс Menu содержит функцию attach(), связывающую все свои кнопки с окном. Объект класса Menu отслеживает все свои кнопки с помощью класса Vector_ref (разделы 13.10 и E.4).
Если хотите создать всплывающее меню (“pop-up” menu), то сможете справиться с этой задачей самостоятельно (подробно об этом — в разделе 16.7).
16.5. Пример
Для того чтобы лучше ознакомиться с возможностями основных средств графического пользовательского интерфейса, рассмотрим окно для простого приложения, в котором происходит ввод, вывод и немного рисования.
Эта программа позволяет пользователю изобразить последовательность линий (незамкнутая ломаная; см. раздел 13.6), заданную как последовательность пар координат. Идея заключается в том, что пользователь постоянно вводит координаты (x, y) в поля ввода next x и next y; после ввода каждой пары пользователь щелкает на кнопке Next point.
Изначально поле ввода current (x, y) остается пустым, а программа ожидает, пока пользователь введет первую пару координат. После этого введенная пара координат появится в поле ввода current (x, y), а ввод каждой новой пары координат приводит к появлению на экране новой линии, проходящей от текущей точки (координаты которой отображаются в поле ввода current (x, y)) до только что введенной пары (x, y), а сама точка (x, y) становится новой текущей точкой.
Так рисуется незамкнутая ломаная. Когда пользователь устанет, он щелкнет на кнопке Quit. Следуя этой простой логике, программа использует несколько полезных средств графического пользовательского интерфейса: ввод и вывод текста, рисование линии и многочисленные кнопки. Окно, показанное выше, демонстрирует результат после ввода двух пар координат. После семи шагов на экране отобразится следующий рисунок.
Определим класс для рисования таких окон. Он довольно прост.
struct Lines_window:Window {
Lines_window(Point xy,int w,int h,const string& title );
Open_polyline lines;
private:
Button next_button; // добавляет пару (next_x,next_y)
// в объект lines
Button quit_button;
In_box next_x;
In_box next_y;
Out_box xy_out;
static void cb_next(Address, Address); // обратный вызов
// next_button
void next();
static void cb_quit(Address, Address); // обратный вызов
// quit_button
void quit();
};
Линия изображается как объект класса Open_polyline. Кнопки и поля ввода-вывода объявляются как объекты классов Button, In_box и Out_box, и для каждой кнопки в них предусмотрены функции-члены, реализующие желательное действие вместе с шаблонным обратным вызовом функции.
Конструктор класса Lines_window инициализирует все его члены.
Lines_window::Lines_window(Point xy,int w,int h,const string& title)
:Window(xy,w,h,title),
next_button(Point(x_max()–150,0),70,20,"Next point",cb_next),
quit_button(Point(x_max()–70,0),70,20,"Quit",cb_quit),
next_x(Point(x_max()–310,0),50,20,"next x: "),
next_y(Point(x_max()–210,0),50,20,"next y: "),
xy_out(Point(100,0),100,20,"current (x,y): ")
{
attach(next_button);
attach(quit_button);
attach(next_x);
attach(next_y);
attach(xy_out);
attach(lines);
}
Иначе говоря, каждый элемент управления окном сначала создается, а потом связывается с окном.
Обработка кнопки Quit тривиальна.
void Lines_window::cb_quit(Address, Address pw) // "как обычно"
{
reference_to<Lines_window>(pw).quit();
}
void Lines_window::quit()
{
hide(); // любопытная идиома библиотеки FLTK для удаления окна
}
Все как обычно: функция обратного вызова (в данном случае cb_quit()) передается функции (в данном случае quit()), выполняющей реальную работу (удаляющей объект класса Window). Для этого используется любопытная идиома библиотеки FLTK, которая просто скрывает окно.
Вся реальная работа выполняется кнопкой Next point. Ее функция обратного вызова устроена как обычно.
void Lines_window::cb_next(Address, Address pw) // " как обычно "
{
reference_to<Lines_window>(pw).next();
}
Функция next() определяет действие, которое действительно выполняется после щелчка на кнопке Next point: она считывает пару координат, обновляет объект Open_polyline и позицию считывания, а также перерисовывает окно.
void Lines_window::next()
{
int x = next_x.get_int();
int y = next_y.get_int();
lines.add(Point(x,y));
// обновляем текущую позицию считывания:
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.
Оставить комментарий
-
Борис14 июнь 00:50
Колокола в России тем и отличались от западных что раскачиаали именно язык колокола,а не сам колокол! Авторы что-жертвы ЕГЭ? Не...
Соединенные Штаты России 3 - Полина Ром
-
Людмила Хофман10 июнь 22:13
У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь...
Долгая игра - Рейчел Рид
-
Анна08 июнь 11:28
Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием ....
Давай поженимся - Юлия Резник
