void remove_from_Folders();

};

Класс определяет две переменные-члена: contents — для хранения текста сообщения и folders — для хранения указателей на объекты класса Folder, в которых присутствует данное сообщение. Получающий строку конструктор копирует ее в переменную contents и (неявно) инициализирует переменную folders пустым набором. Поскольку у этого конструктора есть аргумент по умолчанию, он также является стандартным конструктором класса Message (см. раздел 7.5.1).

Функции-члены save() и remove()

Кроме функций управления копированием, у класса Message есть только две открытых функции-члена: save(), помещающая сообщение в данную папку, и remove(), извлекающая его:

void Message::save(Folder &f) {

 folders.insert(&f); // добавить данную папку в список папок

 f.addMsg(this);     // добавить данное сообщение в набор сообщений

}

void Message::remove(Folder &f) {

 folders.erase(&f); // удалить данную папку из списка папок

 f.remMsg(this);    // удалить данное сообщение из набора сообщений

}

Чтобы сохранить (или удалить) сообщение, требуется модифицировать член folders класса Message. При сохранении сообщения сохраняется указатель на данный объект класса Folder; при удалении сообщения этот указатель удаляется.

Эти функции должны также модифицировать заданный объект класса Folder. Модификация этого объекта является задачей, контролируемой классом Folder при помощи функций-членов addMsg() и remMsg(), которые добавляют или удаляют указатель на данный объект класса Message соответственно.

Управление копированием класса Message

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

// добавить это сообщение в папки, на которые указывает m

void Message::add_to_Folders(const Message &m) {

 for (auto f : m.folders) // для каждой папки, содержащей m,

  f->addMsg(this);        // добавить указатель на это сообщение

                          // в данную папку

}

Здесь происходит вызов функции addMsg() для каждого объекта класса Folder в m.folders. Функция addMsg() добавит указатель на этот объект класса Message в данный объект класса Folder.

Конструктор копий класса Message копирует переменные-члены данного объекта:

Message::Message(const Message &m):

 contents(m.contents), folders(m.folders) {

 add_to_Folders(m); // добавить это сообщение в папки, на которые

                    // указывает m

}

А также вызывает функцию add_to_Folders(), чтобы добавить указатель на недавно созданный объект класса Message каждому объекту класса Folder, который содержит оригинал сообщения.

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

При удалении объекта класса Message следует удалить это сообщение из папок, которые указывают на него. Это общее действие с оператором присвоения копии, поэтому определим для этого общую функцию:

// удалить это сообщение из соответствующих папок

void Message::remove_from_Folders() {

 for (auto f : folders) // для каждого указателя в folders

  f->remMsg(this);      // удалить это сообщение из данной папки

}

Реализация функции remove_from_Folders() подобна таковой у функции add_to_Folders(), за исключением того, что она использует функцию remMsg() для удаления текущего сообщения.

При наличии функции remove_from_Folders() написать деструктор несложно:

Message::~Message() {

 remove_from_Folders();

}

Перейти на страницу:

Похожие книги