Возврат абстрактных типов данных в C ++ без висящих указателей

Здравствуйте,

Я вырос в C # и не очень разбираюсь в C ++. Чтобы создать чистый код, я стараюсь разделить реализацию и интерфейсы и по возможности использовать наследование. И когда я попытался применить типичные концепции C # к C ++, я столкнулся с проблемой, которую до сих пор не мог решить. Я предполагаю, что это, вероятно, тривиально для опытного программиста на C ++, но это уже довольно давно сводит меня с ума.

Сначала я объявляю базовый класс (в настоящее время он не содержит логики, но будет в будущем)

class PropertyBase : public IProperty
{
};

Затем я определяю интерфейс для свойств

class IProperty
{
public:
    virtual ~IProperty() {};
    virtual PropertyBase    correct(const ICorrector &corrector) = 0;
    virtual PropertyBase    joinWith(const PropertyBase &partner, const IRecombinator &recombinator) = 0;
};

Вот где возникает проблема: компилятор возвращает ошибки для двух виртуальных функций, говорящих о том, что не разрешено объявлять функцию, возвращающую абстрактный класс. Конечно, я не хочу возвращать объект типа PropertyBase . Я хочу объявить другие классы, унаследованные от PropertyBase , которые возвращают собственный экземпляр.

Теперь я прочитал, что возможный способ обойти это - изменить подобным образом IProperty на указатели возврата:

class IProperty
{
public:
    virtual ~IProperty() {};
    virtual PropertyBase*   correct(const ICorrector &corrector) = 0;
    virtual PropertyBase*   joinWith(const PropertyBase &partner, const IRecombinator &recombinator) = 0;
};

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

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

5
задан Compuholic 19 April 2011 в 18:44
поделиться