在没有悬空指针的情况下在C++中返回抽象数据类型

Com*_*lic 5 c++ virtual class function abstract

你好,

我来自C#背景,没有很多C++经验.为了生成干净的代码,我尝试将实现和接口分开并尽可能使用继承.当我尝试将典型的C#概念应用于C++时,我遇到了一个迄今为止我无法解决的问题.我认为对于经验丰富的C++程序员来说这可能是微不足道的,但它已经让我疯狂了很长一段时间.

首先我声明一个基类(它目前不包含任何逻辑但将来会包含它)

class PropertyBase : public IProperty
{
};
Run Code Online (Sandbox Code Playgroud)

然后我为Properties定义了一个接口

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

这就是问题所在:编译器返回两个虚函数的错误,说不允许声明一个返回抽象类的函数.当然我不想返回该类型的对象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;
};
Run Code Online (Sandbox Code Playgroud)

但是,如果可能的话,我想避免这种情况,以防止内存泄漏.如果有人能够更好地处理这个问题,那就太棒了.

非常感谢你

Fre*_*Foo 5

如果您害怕内存泄漏,请切换到智能指针.这具有自我记录的额外好处.返回对象的所有权.

class IProperty
{
public:
    virtual ~IProperty() {};
    virtual std::unique_ptr<PropertyBase> correct(const ICorrector &) = 0;
    virtual std::unique_ptr<PropertyBase> joinWith(const PropertyBase &,
                                                   const IRecombinator &) = 0;
};
Run Code Online (Sandbox Code Playgroud)

在您的客户端代码中:

std::unique_ptr<PropertyBase> pb(property.correct(corrector));
// use pb and forget about it; smart pointers do their own cleanup
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要对对象进行引用计数:

std::shared_ptr<PropertyBase> pb(property.correct(corrector));
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN文档unique_ptr,shared_ptr.