【问题标题】:Array operator (->) overload in nested call嵌套调用中的数组运算符 (->) 重载
【发布时间】:2016-12-19 22:02:46
【问题描述】:

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

我做到了……

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;
}
...

ma​​in.cpp - 我在这里为具有集合字段的 Gamer 对象声明并分配内存(作为指针)

Gamer *gamer;

Gamer::allocGamer(gamer);

当我想使用重载数组操作数时,我不能这样做:

gamer->deck->();

但我可以:

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

问题是为什么我不能只调用 gamer->deck->(); 而必须调用 gamer->deck->operator->();而是?

第二个问题 - 我应该如何重载箭头操作数才能直接访问像 gamer->deck->(); 这样的重载操作数?

【问题讨论】:

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


    【解决方案1】:

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

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

    如果没有第二个操作数,就不可能写出deck-&gt;

    将其称为deck-&gt;operator-&gt;(); 有点小题大做,这是合法的,但您不应将代码设计为依赖它,因为这会使读者感到困惑。

    重载operator-&gt;的目的是为了让你可以写deck-&gt;foo。如果你不想写deck-&gt;foo,那么你不应该使用operator-&gt;来做任何你想做的事情。

    例如,如果您只想要一个函数来检索 foo,则将其命名为 get_foo(),而不是 operator-&gt;()

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

    【讨论】:

    • 我知道我可以做一个吸气剂,但我必须做它扔箭头操作符。甚至有可能吗?
    • @PatrykJanik 抱歉,我不确定你在问什么
    • 我无法编辑我的帖子。而不是 throw 应该是 by。我不知道我应该如何转换 gamer->deck->operator->();对于玩家->甲板->();调用操作数重载函数。
    • 所以这意味着我应该调用例如 gamer->deck->showCardCollection();方法首先将启动重载的运算符函数,然后是 showCardCollection() ?如果是,我将断点放入 Gamer::Collection::operator->() 甚至没有进入该函数。
    • @PatrykJanik 你在问题中的代码不是一个很好的例子,重载的operator-&gt; 永远不会被deck-&gt; 调用。因为deck 是一个指针。像所有重载运算符(实际上是所有成员函数)一样,仅当左侧是Gamer 的对象(不是指针)时才调用它。在指针上使用-&gt; 使用内置-&gt;,而不是重载运算符。例如(*gamer-&gt;deck)-&gt;showCardCollection() 会调用操作符。
    猜你喜欢
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2018-06-28
    • 2011-11-15
    相关资源
    最近更新 更多