我想重载数组运算符(->)作为指针的标准运算符,并希望在控制台上显示一些内容。
我做了...
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/