如何在 C 中通过引用返回类对象?
我有一个名为 Object 的类,它存储一些数据。
我想使用这样的函数通过引用返回它:
Object& return_Object();
然后,在我的代码中,我会这样调用它:
Object myObject = return_Object();
我已经编写了这样的代码并且它可以编译。然而,当我运行代码时,我总是遇到段错误。通过引用返回类对象的正确方法是什么?
I have a class called Object which stores some data.
I would like to return it by reference using a function like this:
Object& return_Object();
Then, in my code, I would call it like this:
Object myObject = return_Object();
I have written code like this and it compiles. However, when I run the code, I consistently get a seg fault. What is the proper way to return a class object by reference?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可能返回堆栈上的一个对象。也就是说,
return_Object()
可能看起来像这样:如果这就是您正在做的事情,那么您就不走运了 -
object_to_return
已超出范围并被破坏在return_Object
末尾,因此myObject
引用了一个不存在的对象。您要么需要按值返回,要么返回在更广泛的范围内声明的Object
或new
到堆上。You're probably returning an object that's on the stack. That is,
return_Object()
probably looks like this:If this is what you're doing, you're out of luck -
object_to_return
has gone out of scope and been destructed at the end ofreturn_Object
, somyObject
refers to a non-existent object. You either need to return by value, or return anObject
declared in a wider scope ornew
ed onto the heap.可以使用
仅当返回的对象的作用域大于函数时才 。例如,如果您有一个封装它的类,则可以使用它。如果您在函数中创建对象,请使用指针。如果要修改现有对象,请将其作为参数传递。
You can only use
if the object returned has a greater scope than the function. For example, you can use it if you have a class where it is encapsulated. If you create an object in your function, use pointers. If you want to modify an existing object, pass it as an argument.
您只能通过引用返回非本地对象。析构函数可能使某些内部指针无效,或者其他什么。
不要害怕返回值 - 速度很快!
You can only return non-local objects by reference. The destructor may have invalidated some internal pointer, or whatever.
Don't be afraid of returning values -- it's fast!
我将向您展示一些示例:
第一个示例,不要返回本地范围对象,例如:
您不能通过引用返回
local
,因为local
在最后被销毁dontDoThis
的主体。第二个示例,您可以通过引用返回:
在这里,您可以通过引用返回
s1
和s2
,因为它们是在调用shorterString
之前定义的。第三个例子:
使用代码如下:
get_val
可以通过引用返回s
的元素,因为调用后s
仍然存在。第四个示例
用法示例:
第五个示例:
然后您可以像这样使用上面的
operator=
:I will show you some examples:
First example, do not return local scope object, for example:
You can't return
local
by reference, becauselocal
is destroyed at the end of the body ofdontDoThis
.Second example, you can return by reference:
Here, you can return by reference both
s1
ands2
because they were defined beforeshorterString
was called.Third example:
usage code as below:
get_val
can return elements ofs
by reference becauses
still exists after the call.Fourth example
usage example:
Fifth example:
You could then use the
operator=
above like this:好吧,在代码中它可能不是一个非常漂亮的解决方案,但在函数的界面中它确实很漂亮。而且效率也很高。如果第二个对您来说更重要(例如,您正在开发一个库),那么这是理想的选择。
技巧是这样的:
A a = b.make();
在内部转换为 A 的构造函数,即就像您编写了A a(b.make()) ;
。这是我的最小例子。仅检查
main()
,您可以看到它很简单。内部结构则不然。从速度的角度来看:
Factory::Mediator
类的大小只有2个指针,比1多但不多。这是整个事物中唯一通过价值转移的对象。Well, it is maybe not a really beautiful solution in the code, but it is really beautiful in the interface of your function. And it is also very efficient. It is ideal if the second is more important for you (for example, you are developing a library).
The trick is this:
A a = b.make();
is internally converted to a constructor of A, i.e. as if you had writtenA a(b.make());
.b.make()
should result a new class, with a callback function.Here is my minimal example. Check only the
main()
, as you can see it is simple. The internals aren't.From the viewpoint of the speed: the size of a
Factory::Mediator
class is only 2 pointers, which is more that 1 but not more. And this is the only object in the whole thing which is transferred by value.返回启动的对象并不是一个好的做法,因为它确实超出了范围。在极少数情况下,这是所需的选项。如果该类是引用计数智能指针或其他智能指针,则实际上可以完成此操作。
引用计数智能指针的引用计数如何工作?
It isn't really good practice to return an initiated object as it does go out of scope. There are rare instances that this is the desired option. It actually can be done if the class is a referencing counting smart pointer or some other smart pointer.
How does a reference-counting smart pointer's reference counting work?