应该总是在界面设计中返回指向类的指针?

pie*_*fou 15 c++ oop

我希望我能够返回一个虚拟基类的对象,这样我就不需要处理内存管理了(函数编程的想法也刺激了这种追求).这意味着我正在寻找以下内容:

class Car
{
  public:
     virtual int price() = 0 ;
     virtual string brand() = 0 ;
}

class Interface
{
  public:
     virtual Car giveMeACar() = 0 ;
     virtual vector<Car> listMeAllTheCars() = 0 ;
}
Run Code Online (Sandbox Code Playgroud)

但是,由于Car是一个抽象接口,因此甚至无法编译,并显示错误消息:

成员函数的抽象返回类型无效' virtual Car giveMeACar() = 0; 因为下面的虚拟函数是"内的纯Car": int price()
string brand();

那么,这是否意味着我不得不修改界面类似下面和管理者的记忆我自己(使用后删除实例) -排除使用智能指针的选择.

class Interface
{
  public:
     virtual Car* giveMeACar() = 0 ;
     virtual vector<Car*> listMeAllTheCars() = 0 ;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是我在设计的界面,每一个东西(类)是抽象的唯一选择?

返回接口类的对象在Java中是完全有效的.在这个方面,C++看起来似乎有点笨拙且反直觉.不仅如此,我觉得C++是"指向对象编程语言的指针"而不是"对象编程语言",因为没有指针就无法获得对象编程的太多好处.

Ale*_*x B 8

在Java中,"返回和对象"实际上在语义上等同于在C++中返回指向对象的指针,您试图通过值返回一个对象,它会复制它.您无法复制抽象对象.

因此,虽然C++可能更冗长,但它支持传递参数和返回值的不同语义,Java不支持(按值返回,按引用传递).

话虽如此,你应该通过智能指针返回,它为你做内存管理.其他人已经指出了auto_ptr所有权转移语义,但你也可以使用boost::shared_ptr,如果你在内部使用自定义内存分配(例如池),shared_ptr自定义删除功能将帮助你隐藏界面用户的释放详细信息.它也可以用在STL容器中(与auto_ptr不同).

class Car
{
public:
    typedef boost::shared_ptr<Car> Ptr;
    virtual int price() = 0 ;
    virtual string brand() = 0 ;
};

class Interface
{
public:
    virtual Car::Ptr giveMeACar() = 0 ;
    virtual vector<Car::Ptr> listMeAllTheCars() = 0 ;
}
Run Code Online (Sandbox Code Playgroud)