首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回对对象构造函数的引用

问返回对对象构造函数的引用
EN

Stack Overflow用户
提问于 2011-11-16 00:11:14
回答 3查看 134关注 0票数 0

请看下面的代码:

代码语言:javascript
复制
Foo &Bar::Copy()
{
    return Bar();
}

类Bar继承自Foo,而Foo是一个抽象类。但是当我调用Bar()并返回它时,这样做安全吗?或者,我是否会返回一个局部变量的地址,该变量将在Copy()函数结束时释放?

非常感谢您的建议!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-16 00:42:19

在调用Bar();时,您可以在隐式临时对象上调用构造函数,引用将返回到该对象。如果您打算创建一个类似Clone()的函数,一个典型的解决方案是使用new在堆上创建克隆。您可以使用一种智能指针来简化生命周期管理。您还可以应用协变返回类型,以避免在某些情况下使用signature:Bar &Bar::Copy()进行类型转换

票数 1
EN

Stack Overflow用户

发布于 2011-11-16 00:46:16

你不会返回一个ctor。Bar();调用ctor,创建一个临时对象。然后返回一个对临时对象的引用。

因为C++中的ctor没有名称,所以您不能像在普通函数上那样做许多常见的事情,例如获取/返回指向函数的指针。这里并不完全清楚你真正想要完成的是什么,但是如果你想返回一些构造对象的东西,你通常需要定义一个静态成员函数来调用ctor,并返回一个指向这个静态成员函数的指针。

票数 1
EN

Stack Overflow用户

发布于 2011-11-16 00:14:46

这是一种未定义的行为,因为临时Bar对象将在;中被销毁。

代码语言:javascript
复制
Foo Bar::Copy()
{
    return Bar();
}

更安全。但是多亏了@Cat Plus和@celtschk,我意识到这种方法会导致切片,丢失所有Bar特定的信息。为了保留Bar对象,Copy()必须返回指向该对象的引用或指针。在这里,我们再次开始,因为这是UB。因此,必须动态分配Bar,使其引用/指针位于out of Copy()函数中。谁应该负责删除这个动态生成的Bar对象?

代码语言:javascript
复制
#include <memory>
std::shared_ptr<Foo> Bar::Copy()
{
    return std::shared_ptr(new Bar());
}

shared_ptr将自动为您完成此操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8139408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档