【问题标题】:Combining member access operators with overloaded call operator将成员访问运算符与重载调用运算符相结合
【发布时间】:2015-04-29 18:19:34
【问题描述】:

给定一个带有重载Boo* operator()(unsigned int) 的类Foo,应该如何访问重载的运算符?

我最初尝试过

std::unique_ptr<Foo> foo_ptr(new Foo);
Boo* boo_ptr = foo_ptr(1);

但这不起作用,所以我尝试了:

std::unique_ptr<Foo> foo_ptr(new Foo);
Boo* boo_ptr = foo_ptr->(1);

但这也不起作用(我没想到会这样)。相反,我必须这样做

std::unique_ptr<Foo> foo_ptr(new Foo);
Boo* boo_ptr = (*foo_ptr)(1);

这比在Foo 中声明一个方法(例如ByIndex(unsigned int))更冗长(并使其更短更简洁是我首先重载运算符的原因)。

有没有办法做到这一点而不必使用* 运算符来获取指针的基值?

【问题讨论】:

  • 我实际上并没有在我的代码中 - 我只是在这里的示例中使用它来强调我从指针开始
  • @Columbo 显然没有通读全文。那时我真的不明白这个问题。 “有没有办法从没有*的指针中获取对象”?
  • @Columbo 在那里,将new 的使用更改为std::unique_ptr,这是我在我的代码中实际使用的。我只是第一次没有打扰,因为它根本不影响问题。
  • 为什么人们这么反对这个?这个问题问得并不好,对于那些不太了解 C++ 内部工作原理的人来说,这是一个有效的问题。不幸的是,人们对此投了反对票,甚至没有说明为什么应该投反对票(这对于 OP 能够改进很重要!)。来自我的 +1。
  • @Kvothe 有区别。智能指针可能超载operator()unique_ptr 没有,但我们不知道你用的是哪一个,对吧。

标签: c++ pointers operator-overloading


【解决方案1】:

不,您必须取消引用指针才能访问对象;所以调用运营商的唯一方法是

(*foo_ptr)(1)
foo_ptr->operator()(1);

【讨论】:

  • 谢谢,我很困惑为什么我不能让它与-&gt;一起工作。我没有意识到它需要在前面加上operator
【解决方案2】:

一种方法是参考:

std::unique_ptr<Foo> foo_ptr(new Foo);
Foo& foo_ref = *foo_ptr;

Boo* boo_ptr = foo_ref(1);

除此之外,我认为 Mike Seymour 是正确的,您无法调用 operator()

【讨论】:

  • 虽然没有这个,但我想这个方法会像声明一个成员函数而不是重载括号运算符一样冗长
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多