我希望我能够返回一个虚拟基类的对象,这样我就不需要处理内存管理了(函数编程的想法也刺激了这种追求).这意味着我正在寻找以下内容:
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++是"指向对象编程语言的指针"而不是"对象编程语言",因为没有指针就无法获得对象编程的太多好处.
在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)