繁体   English   中英

如何返回对方法内创建的对象的引用

[英]How to return references to object created inside a method

我推断返回对方法内创建的对象的引用的最佳方法,如下面的情况:

class A{
public:
    A(){}
    ~A(){}
};

class Foo{
public:
    Foo(){}
    ~Foo(){}
    A& create(int random_arg){
         // create object A and return its reference
    }
};

void other_method(){
     Foo f;
     A a = f.create();
     // do stuff with a
{

我考虑了三种可能的解决方案:

  1. 创建一个原始指针并返回一个引用,但这很糟糕,因为无法保证该对象将被正确删除:

     A& create(int random_arg){ A* a = new A(); return *a; } 
  2. 创建一个shared_ptr并按值返回shared_ptr。 通过这种方式,shared_ptr将处理对象删除:

     shared_ptr<A> create(int random_arg){ boost::shared_ptr<A> a_ptr(new A()); return a_ptr; } 
  3. 创建一个shared_ptr并返回一个引用:

     A& create(int random_arg){ boost::shared_ptr<A> a_ptr(new A()); return *a_ptr; } 

第二个解决方案似乎是最常用的,但是这样我必须在应用程序中传播shared_ptr,我更喜欢引用或更好的const引用。

您认为处理这种情况的最佳方法是什么? 还有其他我未考虑过的可能性吗?

不要这样做。 你最有可能有一个悬挂的参考

只需通过值返回A的实例。

编译器可能会忽略隐含的对象副本。 但是,您可以保证不会通过为A编写移动构造函数来创建对象副本。

返回指针或对locals的引用的原因是一个坏主意,因为它们通常位于堆栈上,这意味着当堆栈再次达到该深度时,数据将被覆盖并损坏。

新手经常犯这样的错误,因为它经常会碰巧运气,即在你调用任何其他函数来破坏前一个堆栈帧之前直接使用返回的指针。

在许多情况下,按值返回可能是适用的,编译器可以自由地优化返回。 但即使没有优化也可能不是什么大问题,例如在Qt中所有容器和许多其他类都隐式共享资源,因此通过复制返回并不真正复制所有数据,通常是对象的shell,通常指向实际数据的单个指针。 在C ++中还有移动语义,在这方面有点类似 - 它会将责任从本地移动到返回的对象而不进行深层复制。

有两种主要情况是不希望按值返回。

  • 如果它涉及一个不可避免的重物的副本
  • 如果它是一个带有“身份”的对象 - 这样就会禁用它们的复制构造函数和赋值运算符,所以它们不能真正按值返回

在这些情况下,您只需动态分配对象并返回指向它的指针。 无论您是手动管理还是更喜欢使用智能指针 - 这都符合您的需求。

完成Bathsheba的回答:

只有一种情况,您可能希望执行类似的操作,即如果要将实例返回到单例。 在这种情况下,此类实例将是一个静态对象:

A& getTheOnlyInstanceOfA()
{
   static A onlyInstOfA;
   return onlyInstOfA; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM