2015-10-15 3 views
2

Я работаю над проектом, связанным со многими различными операциями с наборами. У меня есть конкретный вопрос о передаче по ссылке. В файле заголовка я создал объект под названием SoS, который представляет собой набор строк, а его личные члены данных представляют собой вектор строк, называемых m_vos, и булевский, называемый m_cofinite. Вот пример моей путаницы с функцией пересечения, которую я создаю.C++ передача объектов в функции

SoS::makeIntersection(const SoS& B) const { 

} 

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

+0

У вас есть два комплекта. набор, который вы назвали 'makeIntersection', и набор, который вы передаете ему. – NathanOliver

+0

Хорошо, что имеет большой смысл. Я знаю, что одно будет называться m_vos, потому что оно связано с объектом. Будет ли другой просто B? –

+0

Я понимаю, что вам не дали выбора в этом вопросе, но так же, как fyi, в большинстве случаев нечто вроде набора пересечений должно быть определено как свободная функция, принимающая оба набора в качестве аргументов. –

ответ

4

Первый комплект this, и вы получаете доступ к его членам, как this->m_vos.... Второй набор - тот, который вы прошли, и вы получаете доступ к своим членам, например, B.m_vos....

Однако для краткости вы можете опустить this->, если не существует конфликта имен между локальной переменной и переменной-членом. Таким образом, вы можете сделать только m_vos... и B.m_vos....

Также вам нужно рассмотреть, что ваша функция вернется? Может быть, пересечение, которое вы создаете? Это будет третья SoS переменная, вы можете вернуться в результате:

// return type SoS 
SoS SoS::makeIntersection(const SoS& B) const { 

    SoS intersection; // this is the new SoS that will be the intersection 

    // fill intersection.m_vos using B.m_vos and this->m_vos 

    return intersection; // return the intersection version 
} 
1

Объект, к которому вы вызвали функцию, можно получить через this. Второй объект - это аргумент функции.

Первый вектор строк: this->m_vos.
Второй вектор строк: B.m_vos.

Ваше утверждение:

Мне сказали, что я не могу изменить структуру функции таким образом она должна быть так

не имеет смысла для меня.

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

Вы не можете изменить this, чтобы быть результирующим объектом, так как функция является функцией-членом const.

Вы не можете изменить B, чтобы стать результирующим объектом, так как он передается const&.

+0

Вы действительно не должны использовать 'this', хотя. вы можете просто использовать 'm_vos' – NathanOliver

0

Способ вызова функций-членов для класса через его объекты (если не статична). Чтобы получить пересечение двух наборов (объектов sos), вы вызовете функцию, используя один из объектов SoS, и передайте другой в качестве ссылки параметра.

Внутри функции-члена объект, который вы использовали для его вызова, может быть отменен с помощью указателя this.Подробнее here и here.

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