Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Window(int w, int h, const string& title);

// верхний левый угол в точке xy:

Window(Point xy, int w, int h, const string& title);

virtual ~Window { }

int x_max const { return w; }

int y_max const { return h; }

void resize(int ww, int hh) { w=ww, h=hh; size(ww,hh); }

void set_label(const string& s) { label(s.c_str); }

void attach(Shape& s) { shapes.push_back(&s); }

void attach(Widget&);

void detach(Shape& s); //
удаляет элемент w из фигур

void detach(Widget& w); // удаляет элемент w из окна

// (отключает обратные вызовы)

void put_on_top(Shape& p); // помещает объект p поверх

// всех других фигур

protected:

void draw;

private:

vector<Shape*> shapes; // фигуры связываются с окном

int w,h; // размер окна

void init;

};

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

attach
, мы храним указатель в объектах класса
Shape
, поэтому объект класса
Window
может рисовать соответствующую фигуру. Поскольку впоследствии мы можем отсоединить фигуру от окна с помощью функции
detach
, поэтому нам нужен указатель. По существу, присоединенная фигура принадлежит своему коду; мы просто передаем объекту класса
Window
ссылку на нее. Функция
Window::attach
преобразовывает свой аргумент в указатель, чтобы его можно было сохранить. Как показано выше, функция
attach
является тривиальной; функция
detach
немного сложнее. Открыв файл
Window.cpp
, мы видим следующее.

void Window::detach(Shape& s)

// определяет, что первой должна быть удалена

// последняя присоединенная фигура

{

for (unsigned int i = shapes.size; 0<i; ––i)

if (shapes[i–1]==&s) shapes.erase(&shapes[i–1]);

}

Функция-член

erase
удаляет (стирает) значение из вектора, уменьшая его размер на единицу (раздел 20.7.1). Класс
Window
используется как базовый, поэтому он содержит виртуальный деструктор (раздел 17.5.2).

Д.4. Реализация класса Vector_ref

По существу, класс

Vector_ref
имитирует вектор ссылок. Мы можем инициализировать его ссылками или указателями.

• Если объект передается объекту класса

Vector_ref
с помощью ссылки, то предполагается, что он принадлежит вызывающей функции, которая управляет его временем жизни (например, объект — это переменная, находящаяся в определенной области видимости).

• Если объект передается объекту класса

Vector_ref
с помощью указателя, то предполагается,
что он размещен в памяти с помощью оператора
new
, а ответственность за его удаление несет класс
Vector_ref
.

Элемент хранится в объекте класса

Vector_ref
в виде указателя, а не как копия объекта, и имеет семантику ссылок. Например, можно поместить в вектор класса
Vector_ref<Shape>
объект класса
Circle
, не подвергаясь опасности срезки.

template<class T> class Vector_ref {

vector<T*> v;

vector<T*> owned;

public:

Vector_ref {}

Vector_ref(T* a, T* b = 0, T* c = 0, T* d = 0);

~Vector_ref { for (int i=0; i<owned.size; ++i)

delete owned[i]; }

void push_back(T& s) { v.push_back(&s); }

void push_back(T* p) { v.push_back(p); owned.push_back(p); }

T& operator[](int i) { return *v[i]; }

const T& operator[](int i) const { return *v[i]; }

int size const { return v.size; }

};

Деструктор класса

Vector_ref
удаляет каждый объект, переданный ему как указатель.

Д.5. Пример: манипулирование объектами класса Widget

Это законченная программа. Она демонстрирует многие из свойств классов

Widget/Window
. Мы поместили в нее минимальное количество комментариев. К сожалению, такое недостаточное комментирование программ — довольно распространенное явление. Попытайтесь выполнить эту программу и объяснить, как она работает.

#include "../GUI.h"

using namespace Graph_lib;

class W7 : public Window {

// четыре способа продемонстрировать, что кнопка может

// передвигаться:

// показать/скрыть, изменить местоположение, создать новую

// и присоединить/отсоединить

public:

W7(int n, int n, const string& t);

Button* p1; // показать/скрыть

Button* p2;

bool sh_left;

Button* mvp; // переместить

bool mv_left;

Button* cdp; // создать/уничтожить

bool cd_left;

Button* adp1; // активировать/деактивировать

Button* adp2;

bool ad_left;

void sh; // действия

Поделиться:
Популярные книги

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

Командир Красной Армии

Поселягин Владимир Геннадьевич
1. Командир Красной Армии
Фантастика:
попаданцы
8.72
рейтинг книги
Командир Красной Армии

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила

Единственная для невольника

Новикова Татьяна О.
Любовные романы:
любовно-фантастические романы
5.67
рейтинг книги
Единственная для невольника

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Любовь по инструкции

Zzika Nata
Любовные романы:
любовно-фантастические романы
5.85
рейтинг книги
Любовь по инструкции

Город Богов

Парсиев Дмитрий
1. Профсоюз водителей грузовых драконов
Фантастика:
юмористическая фантастика
детективная фантастика
попаданцы
5.00
рейтинг книги
Город Богов

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Мастер Разума II

Кронос Александр
2. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
Мастер Разума II

Сердце Дракона. Том 9

Клеванский Кирилл Сергеевич
9. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.69
рейтинг книги
Сердце Дракона. Том 9

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное