Управление памятью — C ++ клон и создание, чтобы действовать как виртуальный конструктор?

Я изучаю C ++ в классе и работаю над попыткой вернуть указатель на производный объект, используя виртуальную функцию создания / клонирования.

Я нашел эту реализацию и собираюсь построить вокруг нее http://www.cs.uregina.ca/Links/class-info/210/C++FAQ/virtual-functions.html#[20.5]

Что я не понимаю, так это то, как возвращаемый указатель фактически указывает на какие-либо соответствующие данные после того, как clone () или create () выйдут из их блока?

Есть ли лучший подход к этому или мне нужно программировать функцию для каждого случая?

Большое спасибо

class Shape {
public:
virtual ~Shape() { }                 // A virtual destructor
virtual void draw() = 0;             // A pure virtual function
virtual void move() = 0;
// ...
virtual Shape* clone()  const = 0;   // Uses the copy constructor
virtual Shape* create() const = 0;   // Uses the default constructor
};

class Circle : public Shape {
public:
Circle* clone()  const { return new Circle(*this); }
Circle* create() const { return new Circle();      }
// ...
};

1

Решение

…как возвращаемый указатель фактически указывает на какие-либо соответствующие данные после того, как clone () или create () выйдут из их блока?

оператор new выделяет память динамически. Эта память действительна, пока она не будет свободна, используя delete. ни clone() или же create() «Удаляет» эти указатели, и поэтому обе эти функции возвращают действительный указатель.

Есть ли лучший подход к этому или мне нужно программировать функцию для каждого случая?

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

Единственное место, где тип известен, находится внутри методов класса, которые реализуют интерфейс (который в вашем случае Circle). Так что это единственное место, где вы в основном знаете тип, его размер и всю другую необходимую информацию, необходимую для создания и / или копирования объекта. Таким образом, ответ в основном да, вы должны реализовать оба create() а также clone() для каждого класса верхнего уровня, который наследует Shape, В противном случае было бы невозможно создать / клонировать объект, или еще хуже — вы можете столкнуться с нарезка объектов проблема.

Создание статического объекта — жизнеспособный обходной путь, или это сводит на нет всю работу, чтобы быть ОО?

Я не вижу, как создание статического объекта помогает здесь. Статические объекты обычно существуют один экземпляр для каждой области. Вся цель наличия create() а также clone() должен иметь возможность создавать несколько экземпляров объекта (либо по умолчанию, либо копию одного из существующих экземпляров). Таким образом, наличие одного статического экземпляра не поможет реализовать то, что код должен делать.

1

Другие решения

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

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

Чтобы избежать копирования и вставки, я использовал макрос для объявления и реализации всех обязательных функций.

1

По вопросам рекламы [email protected]