ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 使用unique_ptr设计头痛

2019-08-24 11:16:22  阅读:186  来源: 互联网

标签:c c11 factory unique-ptr


假设我们有Foo课:

class Foo {
public:
  ...
};

Foo有一个实例方法,它可以将Foo实例转换为另一个Foo实例,或者返回相同的Foo实例:

<some appropriate pointer type to Foo> Foo::tryToTransform() {
  if (canBeTransformed()) {
    <delete this Foo instance>;
    return <new instance of Foo>;
  }
  else {
    return <this instance of Foo>;
  }
}

客户代码:

<some appropriate pointer type to Foo> foo = ...;
...
foo = foo->tryToTransform();

使用裸指针很容易做到这一点:

Foo* Foo::tryToTransform() {
  if (canBeTransformed()) {
    delete this;
    return new Foo(...);
  }
  else {
    return this;
  }
}

Foo* foo = ...;
...
foo = foo->tryToTransform();

但是如果客户端代码使用unique_ptr而不是裸指针呢?也就是说,理想情况下我希望客户端代码看起来像这样:

unique_ptr<Foo> foo = ...;
...
foo = foo->tryToTransform();

如何定义Foo :: tryToTransform()以启用此类(或类似)客户端代码?

解决方法:

由于tryToTransform函数是成员函数,因此调用者保留unique_ptr的所有权.因此,从成员函数中删除调用者的unique_ptr是不可能的(没有肮脏的技巧).

因此,您需要一个获取unique_ptr所有权的静态函数:

class Foo {
    static unique_ptr<Foo> tryToTransform(unique_ptr<Foo> ptr) {
        if(...) {
            return unique_ptr<Foo>(new Foo()); // old ptr is destroyed
        } else {
            return ptr;
    }
};

打电话给

unique_ptr<Foo> foo = ...;
...
foo = Foo::tryToTransform(move(foo));

这可以通过让tryToTransform获得unique_ptr的所有权来实现.然后它可以按照自己的意愿销毁指针.

标签:c,c11,factory,unique-ptr
来源: https://codeday.me/bug/20190824/1707661.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有