C ++ / синтаксис / адресация функции-члена - PullRequest
1 голос
/ 13 февраля 2012

Я наткнулся на этот код, который действительно смущает меня:

SomeObject->SomeFunction()->AnotherFunction(...);

Что означает вторая стрелка ->, которая следует за вызовом SomeFunction() функции-члена?

P.S. SomeFunction() Функция объявлена ​​внутри класса, как это:

const int * SomeFunction() {return ipValue;}

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

SomeFunction() возвращает указатель на класс, для которого был вызван один из его методов (называемый AnotherFunction).Если разбить его, это может выглядеть так:

Object* obj = SomeObject->SomeFunction();
obj->AnotherFunction();

Как уже упоминалось, если SomeFunction () возвращает int *, это не будет работать.

3 голосов
/ 13 февраля 2012

Это ошибка компиляции.

int - это базовый тип, а не класс, поэтому вы не можете вызывать методы для него.

Этот метод называется методомцепочки .Вы можете вызывать последующие методы, если функция-член возвращает объект или указатель на объект.В вашем случае он не компилируется, так как метод возвращает int.Тем не менее, что-то вроде следующего будет работать:

class A
{
public:
   A* foo();
   A* goo();
};

A* a = new A;
a->foo()->goo()->foo();
1 голос
/ 13 февраля 2012

Это означает, что метод SomeFunction() возвращает некоторый указатель или объект, похожий на указатель, для которого затем вызывается AnotherFunction().

Это означает, что оператор -> имеет точно такое же значение, независимо от того, где он появляется в ваших выражениях.

EDIT

Поскольку тип возвращаемого значения int (до редактирования), код не будет скомпилирован должным образом. Как вы можете видеть здесь , компилятор жалуется на то, что операнд -> не является указателем. Если вы измените тип возвращаемого значения на int *, он все равно не будет компилироваться, поскольку оператор -> можно вызывать только для указателей на типы классов, но не для указателей на фундаментальные типы, такие как int. Здесь - это пример с int * и соответствующим сообщением об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...