2012-02-13 3 views
1

Я наткнулся на этот код, который действительно сбивает с толку меня:C++/синтаксис/адресации функции члена

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

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

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

const int * SomeFunction() {return ipValue;} 
+4

если SomeFunction возвращает Int, что даже не компилировать – pezcode

+0

Это не должно компилировать, так как 'int' не имеет' функции члена AnotherFuntion'. – crashmstr

+1

Еще раз проверьте, SomeFunction должен вернуть указатель на некоторый класс. – jrok

ответ

3

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

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

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

+2

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

+0

SomeFunction() возвращает 'const int *'. Это указано в вопросе. –

+0

Большое спасибо! Это ответило на мой вопрос! –

1

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

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

EDIT:

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

+0

Упс, просто отметили тип возврата, который вы указали для 'SomeFunction()'. В этом случае есть много ошибок. Это не будет компилироваться, а 'const' в возвращаемом типе абсолютно не имеет смысла для компилятора (но иногда может использоваться как документация). – LiKao

+0

И вот доказательство того, что оно не скомпилируется так, как вы его описали: http://ideone.com/9zCTr – LiKao

+0

Почему это было downvoted? – LiKao

3

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

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

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

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

A* a = new A; 
a->foo()->goo()->foo(); 
Смежные вопросы