Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
44
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

27. Заготовка класса без наследников

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

class XClass

{

OClass obj;

public:

XClass();

XClass(const XClass &);

~XClass();

private:

};

inline XClass::XClass():obj(value)

{

..........

}

inline XClass::XClass(const XClass &r):obj(r.obj)

{

..........

}

inline XClass::~XClass() {}

inline const XClass & XClass:: operator=(const XClass &r)

{

if(this!=&r) {

obj=r.obj;

}

return *this;

}

Можно сказать, что заготовка класса с наследниками отличается от этой заготовки тем, что деструктор должен быть виртуальным (virtual).

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

Можно определить конструктор копий в закрытой части класса. Можно будет работать через ссылки и указатели. Альтернативным решением является использование счетчика ссылок на содержимое данных классов.

28. Пример вектора с неповерхностным копированием.

Существуют два основных подхода к реализации операции клонирования:

1. Поверхностное копирование означает, что переменные клонированного объекта содержат те же значения, что и переменные исходного объекта, и что все ссылки указывают на одинаковые объекты. Другими словами, при поверхностном копировании копируется только клонируемый объект, но не объекты, на которые он ссылается. И оригинал, и поверхностная копия ссылаются на одни и те же объекты.

2. Глубокое копирование означает, что переменные клонированного объекта содержат те же самые значения, что и переменные исходного объекта, исключая переменные, которые ссылаются на объекты. Теперь они ссылаются на копии тех объектов, на которые ссылается исходный объект. Другими словами, при глубоком копировании копируется клонируемый объект и те объекты, на которые он ссылается. Глубокая копия ссылается на копии тех объектов, на которые ссылается исходный объект.

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

Поверхностное копирование реализуется проще, так как все классы наследуют Метод clone класса Object, который легко это делает. Однако если класс объекта не реализует интерфейс Cloneable, то метод clone не будет работать. Если все объекты-прототипы, используемые программой, будут клонировать сами себя по методу поверхностного копирования, то, объявив интерфейс

PrototypelF как расширение интерфейса Cloneable, можно будет сэкономить время. Таким образом, все классы, реализующие интерфейс PrototypelF, будут реализовывать также интерфейс Cloneable.

Некоторые объекты, например потоки и сокеты, не могут просто копироваться или совместно использоваться. Какая бы стратегия копирования ни применялась, если имеются ссылки на такие объекты, то для использования скопированных объектов придется создавать эквивалентные объекты.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]