你好,
我来自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;
};
然而,如果可能的话,我希望避免这种情况以防止内存泄漏。如果有更好的处理此问题的方法,那就太好了。
非常感谢。
std::unique_ptr
。shared_ptr
可以从unique_ptr
构造。 - Fred Foo