Выбор сделать функцию членом, не членом, частной, общедоступной и т. д.

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

Предположим, у нас есть программа main(), которая использует реализации шаблонов queue2.h и node2.h из нашего текста, создавая очередь писем (queue letter).

  1. Мы хотим написать оператор потока для вставки всех символов строки (вещь) в очередь (буквы ‹‹ вещь;).

(б) Должны ли мы сделать это ‹‹ членом или не членом? Частный, публичный, друг или ни то, ни другое?

  1. Мы хотим предоставить инструмент (назовем его Get_Front), который возвращает указатель заголовка этой очереди символов для будущих манипуляций с использованием набора инструментов связанного списка.
    Итак, list_head_insert(head_ptr, '2') поместит '2' в начале моей очереди, когда все правильно закодировано.

(б) Должны ли мы сделать Get_Front членом или не членом? Частный, публичный, друг или ни то, ни другое?

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

Большое спасибо!


person FilT    schedule 13.05.2013    source источник
comment
Сделайте вещи, которые должны иметь доступ к закрытым данным-членам, функциями-членами, а вещи, которые не имеют (или не должны быть функциями-членами) свободных функций. Хорошее чтение.   -  person chris    schedule 14.05.2013


Ответы (2)


(б) Должны ли мы сделать это ‹‹ членом или не членом? Частный, публичный, друг или ни то, ни другое?

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

Причина: мы хотели вставить в поток очереди, а не во внешний поток, такой как cout. Лучше использовать функции-члены всякий раз, когда это возможно. Друзей следует использовать только тогда, когда члены не могут быть использованы.

Get_Front() становится общедоступной функцией-членом.

person bjskishore123    schedule 13.05.2013
comment
Я согласен с тем, что функции-члены обычно следует использовать поверх дружественных функций, но не по недружественным бесплатным функциям. - person chris; 14.05.2013
comment
@chris: вы имеете в виду функции типа C? не могли бы вы уточнить - person bjskishore123; 14.05.2013
comment
Я имею в виду, если функции не нужен доступ к закрытым частям вашего класса, зачем давать ей возможность это делать? - person chris; 14.05.2013
comment
@chris: Да, в этом случае мы можем использовать функции, не являющиеся друзьями и не являющимися членами. - person bjskishore123; 14.05.2013

Трудно сказать, не зная истинного предназначения программы, которую вы описали выше. Я могу дать вам несколько общий ответ.

Сделать функцию

  1. PUBLIC, если вы хотите, чтобы к нему мог получить доступ кто угодно.
  2. PRIVATE, если вы хотите получить доступ только к функциям-членам и друзьям этого класса.
  3. PROTECTED, если вы хотите получить доступ только к функциям-членам и друзьям этого класса, а также к функциям-членам и друзьям производного класса.
  4. ДРУГ, если вы хотите получить доступ к закрытым членам классов.

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

person namu    schedule 13.05.2013