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

C++ 嵌套调用中的数组运算符(>;)重载,c++,operator-overloading,inner-classes,C++,Operator Overloading,Inner Classes,我想将数组运算符(->)重载为指针的标准运算符,并在控制台上显示其他内容 我确实 Gamer.h文件(Gamer类与嵌套的Collecion类): Gamer.cpp ... Gamer::Collection* Gamer::Collection::operator->() { cout << "Pointer on deck >> " << this << endl; return this; } ... 当我想使用重载

我想将数组运算符(->)重载为指针的标准运算符,并在控制台上显示其他内容

我确实

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

Gamer.cpp

...
Gamer::Collection* Gamer::Collection::operator->()
{
    cout << "Pointer on deck >> " << this << endl;
    return this;
}
...
当我想使用重载数组opperand时,我不能:

gamer->deck->();
但我可以:

gamer->deck->operator->();
问题是为什么我不能直接叫玩家->甲板->();并且必须呼叫玩家->甲板->操作员->();相反


还有第二个问题——我应该如何重载arrow opperand来直接访问重载的opperand,比如gamer->deck->()

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

  deck -> foo
// ^        ^---- second operand
// |
// \------- first operand
如果没有第二个操作数,则无法写入
deck->

称之为
deck->operator->()
有点像黑客,这是合法的,但是你不应该设计你的代码来依赖它,因为它会让读者感到困惑

重载
operator->
的目的是让您可以编写
deck->foo
。如果您不想编写
deck->foo
,那么无论您想做什么,都不应该使用
operator->

例如,如果您只希望函数检索
foo
,则调用它
get\u foo()
,而不是
operator->()


注:
Gamer::allocGamer(Gamer)
是可疑的(如果
allocGamer
按值获取其参数,则这是一个bug,如果它按引用获取,则这是一个不寻常的习惯用法,会让阅读代码的人感到困惑)。如果不使用内存管理,也不强制类的用户使用手动内存管理,那么代码将更简单。

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

  deck -> foo
// ^        ^---- second operand
// |
// \------- first operand
如果没有第二个操作数,则无法写入
deck->

称之为
deck->operator->()
有点像黑客,这是合法的,但是你不应该设计你的代码来依赖它,因为它会让读者感到困惑

重载
operator->
的目的是让您可以编写
deck->foo
。如果您不想编写
deck->foo
,那么无论您想做什么,都不应该使用
operator->

例如,如果您只希望函数检索
foo
,则调用它
get\u foo()
,而不是
operator->()


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

我知道我可以成为一个getter,但我必须使用arrow opperator。这甚至是可能的?@PatrykJanik抱歉,我不知道你在问什么我不能编辑我的帖子。与其扔,不如扔。我不知道该如何改变玩家->套牌->操作员->();对于玩家->牌组->();调用opperand重载函数。这意味着我应该在什么时候调用,例如gamer->deck->showCardCollection();方法将首先启动重载的Operator函数,然后启动showCardCollection()?如果是,我将断点放入Gamer::Collection::operator->()中,而它甚至没有进入该函数。@PatrykJanik问题中的代码不是一个好例子,重载的
运算符->
将永远不会被
甲板->
调用。因为
deck
是指针。与所有重载运算符(以及所有成员函数)一样,它仅在左侧是
玩家的对象(而不是指针)时调用。在指针上使用
->
使用内置的
->
,而不是重载运算符。例如,
(*gamer->deck)->showCardCollection()
将调用操作符。我知道我可以创建一个getter,但我必须创建一个arrow opperator。这甚至是可能的?@PatrykJanik抱歉,我不知道你在问什么我不能编辑我的帖子。与其扔,不如扔。我不知道该如何改变玩家->套牌->操作员->();对于玩家->牌组->();调用opperand重载函数。这意味着我应该在什么时候调用,例如gamer->deck->showCardCollection();方法将首先启动重载的Operator函数,然后启动showCardCollection()?如果是,我将断点放入Gamer::Collection::operator->()中,而它甚至没有进入该函数。@PatrykJanik问题中的代码不是一个好例子,重载的
运算符->
将永远不会被
甲板->
调用。因为
deck
是指针。与所有重载运算符(以及所有成员函数)一样,它仅在左侧是
玩家的对象(而不是指针)时调用。在指针上使用
->
使用内置的
->
,而不是重载运算符。例如,
(*gamer->deck)->showCardCollection()
将调用操作符。
  deck -> foo
// ^        ^---- second operand
// |
// \------- first operand