Программирование. Принципы и практика использования C++ Исправленное издание, стр. 439
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()WindowД.4. Реализация класса Vector_ref
По существу, класс
Vector_ref• Если объект передается объекту класса
Vector_ref• Если объект передается объекту класса
Vector_refnewVector_refЭлемент хранится в объекте класса
Vector_refVector_ref<Shape>Circletemplate<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(); // действия void mv(); void cd(); void ad(); static void cb_sh(Address, Address addr) // обратные вызовы { reference_to<W7>(addr).sh(); } static void cb_mv(Address, Address addr) { reference_to<W7>(addr).mv(); } static void cb_cd(Address, Address addr) { reference_to<W7>(addr).cd(); } static void cb_ad(Address, Address addr) { reference_to<W7>(addr).ad(); }};Однако объект класса
W7Window7W7::W7(int w, int h, const string& t) :Window(w,h,t), sh_left(true),mv_left(true),cd_left(true),ad_left(true){ p1 = new Button(Point(100,100),50,20,"show",cb_sh); p2 = new Button(Point(200,100),50,20,"hide",cb_sh); mvp = new Button(Point(100,200),50,20,"move",cb_mv);