如何实现创建新对象的C方法,并返回对它的引用

我有一个C AuthenticatingProxy类实例与下面的方法.此方法创建一个Response对象,然后使用state更新,然后返回.由于Response对象的内部,它无法复制(即我不能简单地按值返回).

const Response& AuthenticatingProxy::Get(const std::string& host,
                                  const std::string& path,
                                  const http_headers& headers)
{
  static Response response;
  // do the HTTP call, and set response's state here
  return response;
}

在AuthenticatingProxy类中,此方法可能会发生许多调用,因此在此处使用静态变量并不理想.有人可以建议一个解决方案,返回一个未在函数退出时销毁的引用吗?谢谢.

我在研究中最接近的是最佳实践页面,提到“按引用返回,而不是值,创建大对象的地方”但我还没有找到一个例子!所有示例都是针对传入然后返回的引用,或者对于int&样式引用 – 不是在函数本身内创建对象实例的样式引用.

我认为解决方案可能存在于将函数返回响应作为值,但在调用代码中使用const变量来捕获它.不确定这是否仅适用于int – 我找到的所有示例都使用基本类型.任何帮助非常感谢.

最佳答案

Because of the internals of the Response object it cannot be copied (i.e. I cannot simply return by value).

您正在描述C 03中存在但不再存在的问题.

以老爱的std :: fstream为例.基本上,在内部*中,它保存了一个文件描述符/句柄,用于从/向文件读/写.
由于C的性质和设计,fstream析构函数关闭了该文件句柄,以便清理对象并防止句柄泄漏.

由于fstream对象的内部结构,它无法按值返回.按值返回意味着以某种方式阻止析构函数关闭该文件句柄,或者使复制构造函数以某种方式复制该句柄.拥有跨平台解决方案即使不是不可能也是极其困难的.更不用说复制内部缓冲区是完全错误的.

所以直到C 11,你无法按价值返回fstream.
然后发明了移动语义.

在C 11中,您只需移动对象而不是复制它.在fstream示例中,移动构造函数浅复制文件句柄,同时使原始文件句柄指针无效.原始对象析构函数将检查原始文件句柄,看它是无效的并跳过关闭它.

这是解决您问题的惯用解决方案.虽然您无法复制对象,但您肯定可以为它实现移动语义.对象的内部将移动到返回值,而原始对象在某种情况下保持“空”.

移动语义的好解释可以在这个SO答案中找到:What are move semantics?

如果该解决方案也不可行,则在动态内存存储(“堆”)中声明该对象,并通过某个智能指针返回该对象.

How to implement a C++ method that creates a new object, and returns a
reference to it

即使你可以,也不要这样做.

*是的,文件句柄可以存储在streambuff对象中,我简单地描述了问题.

转载注明原文:如何实现创建新对象的C方法,并返回对它的引用 - 代码日志