所以,我有一个函数应该返回一个未知类型的对象,比如C或B.我已经决定添加一个公共基类A并返回它是一个很好的解决方案。我已将int type
字段添加到A中,因此我们可以将C对象与C对象区分开来
例如,函数本身如下所示:
A f(int x) {
if (x==0)
return B();
else
return C();
}
作为其用法的一个例子:
A a=f(0);
B b; C c;
if (a.type==OBJ_TYPE_B)
b=a;
else
c=a;
问题很明显:从基类到派生的显式转换是不允许的。我看到两个解决方案:指针和引用。指针太C-ish,我不想使用它们。我相信C ++有更好的东西。
我也试过使用引用,但我不知道如何处理对临时对象的引用。
请帮助。
答案 0 :(得分:1)
返回指针或引用(假设A
是多态基础)是最基本的方法,并且相当常用。在函数返回后,必须确保指向(或引用)的对象继续存在 - 否则调用者尝试使用它会产生未定义的行为。
另一个常见要求是必须管理对象的生命周期。例如,如果函数使用运算符new
创建对象,则在不再需要时必须使用运算符delete
释放对象,否则结果将是内存泄漏。问题是必须由调用者以某种方式处理对象的释放。如果函数返回一个指针,那么该指针可以存储在一个智能指针中(例如C ++ 11或更高版本中的模板std::unique_pointer
),它将管理它的生命周期。或者,可以更改该函数以返回智能指针。
如果您使用智能指针,请仔细阅读其文档。一些智能指针对如何使用它们有特定的限制。通常,他们会假设他们管理的对象是如何创建的(因此,如果使用operator new
创建对象,则智能指针的析构函数可以使用operator delete
释放对象) 。通过与创建方式不一致的方式释放对象会产生未定义的行为。智能指针在允许对象之间的处理方式上也有所不同(例如,只有一个智能指针可以引用一个给定的对象,或者很多?)。
没有什么" C ish"关于使用指针 - 尽管一些C ++语言狂热者或语言宗教坚果可能告诉你。这是一种技术,你必须尊重它的极限 - 如果你弄错了,就会遇到麻烦。还有其他需要考虑的选择,例如智能指针,它们各有利弊。