Алло,
Я из 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;
};
Однако я хотел бы избежать этого, если это возможно, чтобы предотвратить утечки памяти. Было бы здорово, если бы у кого-то была лучшая идея для решения этой проблемы.
Большое спасибо