嵌套调用中的数组运算符( - >)重载

时间:2016-12-19 22:02:46

标签: c++ operator-overloading inner-classes

我希望将数组操作符( - >)作为指针的标准运算符重载,并在控制台上显示一些想法。

我做了......

Gamer.h 文件( Gamer 类,嵌套 Collecion 类):

class Gamer {

class Collection
{
public:
    Collection();
    Collection* operator->();
}
public:
Gamer();

Collection *deck;
}

Gamer.cpp

...
Gamer::Collection* Gamer::Collection::operator->()
{
    cout << "Pointer on deck >> " << this << endl;
    return this;
}
...

main.cpp - 这里我为Gamer对象声明并分配内存,其中包含集合字段(作为指针)

Gamer *gamer;

Gamer::allocGamer(gamer);

当我想使用重载数组oppe时,我无法做到:

gamer->deck->();

但我可以:

gamer->deck->operator->();

问题是为什么我不能打电话给 gamer-&gt; deck-&gt;(); 并且必须调用 gamer-&gt; deck-&gt; operator-&gt;() ; 而不是?

第二个问题 - 我应该如何重载arrow opperand直接访问重载的opperand,如 gamer-&gt; deck-&gt;();

1 个答案:

答案 0 :(得分:3)

operator->是二元运算符。 “二元运算符”意味着它需要两个操作数。例如:

  deck -> foo
// ^        ^---- second operand
// |
// \------- first operand

如果没有第二个操作数,则无法编写deck->

将其称为deck->operator->();有点骇人听闻,这是合法的,但你不应该设计你的代码来依赖它,因为它会让读者感到困惑。

重载operator->的目的是让您可以编写deck->foo。如果您不想写deck->foo,那么您不应该使用operator->来做任何您想做的事情。

例如,如果您只想要一个函数来检索foo,请将其称为get_foo(),而不是operator->()

注意:Gamer::allocGamer(gamer);是可疑的(如果allocGamer按值获取其参数这是一个错误,如果通过引用获取它,那么这是一个不寻常的习惯用法,会让读取代码的人感到困惑)。如果您不使用内存管理,您的代码将更简单,并且不要强迫您的类的用户使用手动内存管理。