2015-09-22 2 views
-1

Выполняя обратную разработку кода в C++, я нашел часть кода, который не получается вообще. Я новичок в C++, и способ, задающий вопрос, может быть неправильным, поскольку я не знаю, как задать этот конкретный вопрос, пожалуйста, извините меня за то же самое. Позвольте мне подробно рассказать об этом. Я столкнулся с чем-то вроде этого в коде.Объект, вызывающий метод, в свою очередь вызывающий другого в C++

obj.function_1().function_2(argument) 

и в некоторых местах я обнаружил, как

function_1().function_2(argument) 

function_1() и function_2() бывают разных классов. Может кто-нибудь, пожалуйста, помогите мне в этом, что означает две вышеуказанные линии.

+0

Возможно, другой объект возвращается из функции? Вы должны опубликовать связанный код –

+1

Прочтите 'function_1' (или, по крайней мере, его объявление) и обратите внимание на тип возврата. Затем, получите книгу или что-то еще - задавать вопросы обо всем, что вы видите, это плохой способ выучить язык и действительно плохо использовать время всех elses. – Useless

ответ

0

obj.function_1().function_2(argument)
-> называют function_1() из obj, а затем вызвать function_2(argument) для возвращаемого значения obj.function_1()

function_1().function_2(argument)
-> называют function_1() (в глобальной или в классе, когда этот код), то все function_2(argument) для возвращаемого значения function_1()

1

obj.function_1() будет возвращать объект, который имеет функцию-член, называемую function_2.

Это будет то же самое для function_1().function_2(argument).

+0

Или он может вернуть ссылку на объект временного участника. – Useless

+0

@ Бездумно, вы правы. Ред. – Ralara

0
obj.function_1().function_2(argument) 

означает, что obj имеет function_1() и тип возвращаемого (вероятно, объект некоторого типа) из function_1() имеет function_2(), который принимает argument в качестве параметра.

Аналогично,

function_1().function_2(argument) 

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

1

Он просто вызывает function_2(argument) возвращаемого значения function_1(). Не Вы также можете написать это как

ObjA obja; 
ObjB objb = obja.function_1(); 
objb.function_2(argument); 

Той же работа с вашим вторым примером:

ObjB objb = function_1(); 
objb.function_2(argument); 

написано в коде по-разному, чтобы не беспокоиться о том, что временном переменном, вероятно, потому, что не требуется позже.

+0

За исключением того, что ваши примеры копируются по значению, которые _may_ (в зависимости от типа возврата) значительно меняют поведение. – Useless

+0

В примере OP мы немедленно отбрасываем временный объект. Предположим, что 'function_2 (argument)' будет средством для объектов ObjB. Imho в примере OP новое заданное значение нигде не может быть использовано. В моем примере можно использовать измененный объект. Конечно, я предположил, что «ObjB (const ObjB &)» и «ObjB & operator = (const ObjB &)» реализованы должным образом. Таким образом, я не получаю такого значительного изменения поведения. Не могли бы вы рассказать? – mistapink

+1

Если функция 'function_1' возвращает ссылку на объект, принадлежащий' obja', вы просто использовали _local копию этого объекта_, а не экземпляр 'obja'. Итак, если вы изменили объект, ваше изменение будет потеряно. Если ссылка относится к базовому типу полиморфного объекта, вы дополнительно нарезали его, и если 'function_2' является виртуальным, вы потенциально вызывали другую перегрузку, чем предполагалось. – Useless

0

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

Нет. Это зависит от того, какие именно объекты и функции являются, и вы не показали, что.Невозможно сказать, что делает код, если только вы не можете посмотреть весь код.

Например, все эти сценарии различны:

  1. OBJ имеет тип std::vector<int>, function_1 == std::vector<int>::rbegin и function_2 == std::vector<int>::reverse_iterator::operator[]

    Здесь, в последней строке

    std::vector<int> obj = { 1, 2 }; 
    obj.rbegin().operator[](0); 
    

    дает int& ссылка на последний элемент вектора (и ничего не меняет)

  2. OBJ имеет тип std::vector<std::complex<double>>, function_1 == std::vector<std::complex<double>>::front и function_2 == std::complex<double>::operator+=

    std::vector<std::complex<double>> obj = {{1,1}, {-1,-1}}; 
    obj.front().operator+=(-1); 
    

    вычитает 1 из действительной части первого комплексного элемента, в результате чего {0,1} = я в качестве первого элемента вместо {1,1} = 1 + I ,

  3. OBJ имеет тип MyBigRDBMS, function_1 == GetTables (возвращает прокси-сервер для сбора всех таблиц в нашей БД), и function_2 == Drop

    obj.GetAllTables.Drop(); 
    

    удаляет все таблицы из нашей БД.

Смежные вопросы