嵌套调用中的数组运算符 (->) 重载
Array operator (->) overload in nested call
我想重载数组运算符 (->) 作为指针的标准运算符,另外想在控制台上显示一些想法。
我做到了...
Gamer.h 文件(Gamer class 嵌套 Collecion class) :
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);
当我想使用重载数组运算符时我做不到:
gamer->deck->();
但我可以:
gamer->deck->operator->();
问题是为什么我不能只调用 gamer->deck->(); 而必须调用 gamer->deck->operator-> (); 而不是 ?
第二个问题 - 我应该如何重载箭头操作数以直接访问重载的操作数,例如 gamer->deck->(); ?
operator->
是二元运算符。 "binary operator" 表示需要两个操作数。例如:
deck -> foo
// ^ ^---- second operand
// |
// \------- first operand
没有第二个操作数是不可能写deck->
的。
将其称为 deck->operator->();
有点乱,这是合法的,但您不应将代码设计为依赖于此,因为这会使读者感到困惑。
重载operator->
的目的是让你可以写deck->foo
。如果你不想写 deck->foo
那么你不应该使用 operator->
来做任何你想做的事情。
例如,如果您只想要一个函数来检索 foo
,则将其命名为 get_foo()
,而不是 operator->()
。
注意:Gamer::allocGamer(gamer);
是可疑的(如果 allocGamer
按值获取参数,这是一个错误,如果按引用获取参数,那么这是一个不寻常的习语,会使阅读的人感到困惑你的代码)。如果您不使用内存管理,您的代码会更简单,也不要强迫您的 class 用户使用手动内存管理。
我想重载数组运算符 (->) 作为指针的标准运算符,另外想在控制台上显示一些想法。
我做到了...
Gamer.h 文件(Gamer class 嵌套 Collecion class) :
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);
当我想使用重载数组运算符时我做不到:
gamer->deck->();
但我可以:
gamer->deck->operator->();
问题是为什么我不能只调用 gamer->deck->(); 而必须调用 gamer->deck->operator-> (); 而不是 ?
第二个问题 - 我应该如何重载箭头操作数以直接访问重载的操作数,例如 gamer->deck->(); ?
operator->
是二元运算符。 "binary operator" 表示需要两个操作数。例如:
deck -> foo
// ^ ^---- second operand
// |
// \------- first operand
没有第二个操作数是不可能写deck->
的。
将其称为 deck->operator->();
有点乱,这是合法的,但您不应将代码设计为依赖于此,因为这会使读者感到困惑。
重载operator->
的目的是让你可以写deck->foo
。如果你不想写 deck->foo
那么你不应该使用 operator->
来做任何你想做的事情。
例如,如果您只想要一个函数来检索 foo
,则将其命名为 get_foo()
,而不是 operator->()
。
注意:Gamer::allocGamer(gamer);
是可疑的(如果 allocGamer
按值获取参数,这是一个错误,如果按引用获取参数,那么这是一个不寻常的习语,会使阅读的人感到困惑你的代码)。如果您不使用内存管理,您的代码会更简单,也不要强迫您的 class 用户使用手动内存管理。