Правильный подход к созданию копий

Рейтинг: 1Ответов: 1Опубликовано: 13.03.2015

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

class Base
{
public:
    Base() {}
    virtual ~Base() {}
    virtual Base* copy() const = 0;
    virtual void show() const = 0;
};

class ClassInt : public Base
{
public:
    ClassInt(int data) : _data(data) {}

    Base* copy() const { return new ClassInt(_data); }
    void show() const { /* показать целое */ }

private:
    int _data;
};

class ClassDouble : public Base
{
public:
    ClassDouble(double data) : _data(data) {}

    Base* copy() const { return new ClassDouble(_data); }
    void show() const { /* показать дробное */ }

private:
    double _data;
};

Т.е., работая с указателем на Base, мы можем показать его через show, не думая о реализации. А если нам нужно получить клон, то вызываем copy. Честно говоря, меня терзают смутные сомнения, что подобное делается элегантнее. Или все нормально?

Ответы

▲ 0Принят

Не могу понять, что вам не нравится и при чём здесь вообще функция show. Мои замечания: лучше использовать стандартное имя для таких функций, а именно clone; лучше возвращать объект этого же класса, то есть ClassInt* clone() const { return new ClassInt(_data); }, чтобы можно было написать ClassInt* t=ClassInt(2).clone();.