【问题标题】:C++ - overload structure dereference operator and use it in unique_ptrC++ - 重载结构取消引用运算符并在 unique_ptr 中使用它
【发布时间】:2020-04-13 23:28:29
【问题描述】:

我有一个实现类和一个包装类,我想通过结构取消引用(->)操作符的包装类访问实现类实例。到目前为止,没问题。

class Implementation
{
  public:
    doSomething();
}

class Wrapper
{
  public:
    Implementation* operator->() {
      return _implPtr.get();
    }
  private:
    std::shared_ptr<Implementation> _implPtr;
}

当我像下面这样使用它时它会起作用:

Wrapper wrapper;
wrapper->doSomething();

但是当我使用带有 unique_ptr 的包装类时,编译器会抛出错误:

auto wrapper = std::make_unique<Wrapper>();
wrapper->doSomething();

错误是“'class Wrapper' 没有名为 'doSomething' 的成员”。

在这种情况下如何访问实现类?

【问题讨论】:

  • _implPtr-&gt;get(); -- 不应该是_implPtr.get();吗?
  • 你不能。 unique_ptr 增加了一个间接——设计使然!出于同样的原因,您的代码也不适用于 Wrapper* 对象。使用(*wrapper)-&gt;doSomething
  • 显示的代码显然不是编译错误的真实代码,所以任何关于编译错误原因的猜测都无非是猜测,随机猜测。
  • @PaulMcKenzie 是的,我总结时的错误
  • @SamVarshavchik 我不能分享真正的代码,因为真正的类很大,我不允许分享它们

标签: c++ smart-pointers dereference


【解决方案1】:

std::unique_ptr(和std::shared_ptr)有自己的operator-&gt; 来返回它持有的指针。

您的失败代码本质上是这样做的:

auto wrapper = std::make_unique<Wrapper>();
//wrapper->doSomething();
Wrapper *ptr = wrapper.operator->();
ptr->doSomething(); // ERROR!

确实,您的 doSomething() 类中没有 doSomething() 方法。

要执行您正在尝试的操作,您需要取消引用Wrapper* 指针以访问实际的Wrapper 对象,然后您可以调用它自己的operator-&gt; 来访问它的Implementation* 指针,例如:

auto wrapper = std::make_unique<Wrapper>();
(*wrapper)->doSomething();

基本上是这样做的:

auto wrapper = std::make_unique<Wrapper>();
//(*wrapper)->doSomething();
Wrapper &ref = wrapper.operator*();
Implementation *impl = ref.operator->();
impl->doSomething(); // OK!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多