Предоставление указателя на приватный член из класса - PullRequest
0 голосов
/ 19 мая 2018

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

У вас есть класс, который вызывает метод другого класса (который ожидает указатель на некоторое приватное поле), и адрес этого закрытого члена передается в качестве параметра этому методу.

Насколько я могу видеть, пока адрес частного члена предоставляется только способом, контролируемым разработчиком класса, это не нарушает инкапсуляцию (т.е. разработчик точно знает, как он собираетсяиспользоваться).Конечно, вызываемый метод может (при условии, что вы его не написали) выставить закрытый член, но нужно ли нам смотреть так далеко вперед?Я видел, как это делалось бесчисленное количество раз, так что я думаю, что это не результат плохих методов проектирования?

Разве это плохая практика - писать метод, который принимает указатели на закрытые члены других классов и модифицирует их?Должен ли каждый класс только «заботиться о себе»?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

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

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

0 голосов
/ 19 мая 2018

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

Это неверно для начала,

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

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

Редактировать в отношении второй части вопроса:

Предполагается, что любой класс должен разумно обрабатывать любые возможные варианты использования своего открытого интерфейса (включая разыменование ссылок).любые возвращенные указатели).Предполагается, что то, кто или кто использует открытый интерфейс, совершенно не имеет значения, и вы должны предполагать, что все пользователи класса будут использовать весь открытый API.

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

...