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

我做了...

Gamer.h文件(具有嵌套Collecion类的Gamer类):

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);


当我想使用重载数组opperand时,我不能做:

gamer->deck->();


但是我可以 :

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


问题是为什么我不能只打电话给gamer-> deck->();并必须调用游戏玩家->甲板->操作员->();相反?

第二个问题-我应该如何重载箭头操作符以直接访问重载的操作符,例如gamer-> deck->(); ?

最佳答案

operator->是二进制运算符。 “二进制运算符”表示需要两个操作数。例如:

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


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

将其称为deck->operator->();有点hack,这是合法的,但您不应设计代码依赖于此,因为它会使读者感到困惑。

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

例如,如果只希望函数检索foo,则将其称为get_foo(),而不是operator->()

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

关于c++ - 嵌套调用中的数组运算符(->)重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41231743/

10-09 13:25