0

我正在编写一个代码库,我遇到了一些让我很难过的东西,或者至少让我三思而后行。

我有一个通过引用传递的函数的参数,如下所示:

const PathTile &refTile

在函数中的某一时刻,pathTile可以像预期的那样使用操作符->访问 的成员函数,使用操作符访问相同的成员函数只需几行.。奇怪的是代码有效。使用时这是->隐含的.吗?

我问是因为我不确定前一个人是否故意这样做。我应该改变它吗?

4

4 回答 4

4

在函数中的某一点,使用 -> 操作符访问 pathTile 的成员函数,就像预期的那样

这是不正确的。引用成员通常应通过.. 正如 Seth 在评论中指出的那样,->可以重载......当您想假装您的类型是指针时,这很有用。.不能超载。

这是 -> 当 . 用来??

不,必须有另一种解释。->(立即想到不同的变量和重载)

于 2013-02-26T20:14:09.487 回答
2

有一些称为智能指针的特殊对象,其使用方式几乎与常规指针相同。提供它们重载 operator -> 但它们是真实对象,因此您可以通过 . 所以:

struct Foobar { void method(); };
smart_pointer<Foobar> spointer;
spointer->method(); // called method() of class Foobar of instance where spointer points to
spointer.reset();   // called reset() of object spointer itself.

如果您使用引用没有区别,因此如果上面示例中的指针是对类型 smart_pointer 的引用,那么它将是相同的。

于 2013-02-26T20:23:17.317 回答
1

这可能与您可以:

foo *x=new foo();
foo &y=*x;

现在:

x->bar();

和:

y.bar();

是等效的、合法的、有效的、将编译并做同样的事情等。

请更多代码

于 2013-02-26T20:19:41.513 回答
0

不,访问是不一样的/可互换的,仅仅是因为它们是引用。

一种常见的情况是被引用对象是容器对象(即智能指针)时;obj.member可以访问容器成员,同时obj->member可以通过operator->().

我会PathTile检查operator->().

于 2013-02-26T20:19:54.533 回答