1

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

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

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

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

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

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();  } 
    // ... 
}; 
+0

Является ли создание статического объекта жизнеспособным обходным путем или это отрицает, что все работы являются OO? Извините, но это еще не все. – Flexo1515

ответ

1

... как же указатель, возвращаемый на самом деле указывают на любые соответствующие данные после того, как клон() или создать() выйти из своего блока?

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

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

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

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

Является ли создание статического объекта жизнеспособным обходным путем или это отрицает, что все работы являются OO?

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

+0

Ух, спасибо. Мои умы немного сгорели, поэтому я почему-то даже не подумал об этом, что было бы утечкой памяти в другой ситуации. Большое спасибо. – Flexo1515

1

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

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

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