#c
#c
Вопрос:
Как указано в вопросе, если вызывается queue1.compareQueues(queue2), можно ли получить доступ к queue2.frontNode в методе queue1?
bool Queue::compareQueues(Queueamp; queue2) {
Node* queue1Pointer = frontNode;
Node* queue2Pointer = queue2.frontNode;
return true;
};
Комментарии:
1. Да, это нормально и нормально. Это не связано, но ваш метод и параметр должны быть
const
, однако,bool Queue::compareQueues(const Queueamp; queue2) const {
2. ДА. класс имеет доступ к
private
членам во всех экземплярах, а не только к текущему, на который указываетthis
. Хороший это дизайн или нет — это другой вопрос… что не ясно из кода без операции, который вы показали здесь.3. @HotPotTofu В обычном порядке вещей функция для сравнения двух очередей не изменит ни одну из двух очередей, поэтому в этой функции обе очереди должны быть const .
const {
делаетthis
const .4. @HotPotTofu Лично я бы (почти) никогда не считал это плохим дизайном. Язык допускает это по уважительной причине. Если вы разрешаете доступ внешнего мира к частным объектам класса, это может нарушить инварианты класса, но коду, который является частью класса, следует доверять, чтобы он этого не делал. Аналогично, код вне класса не должен зависеть от внутренних компонентов класса, но для кода внутри класса это не проблема.
5. @HotPotTofu Это будет потому, что вы не написали конструктор копирования для своего класса (или вы написали его, но он прослушивается). Как и раньше, см. Ссылку, это очень важная тема, которая достаточно хорошо объяснена там (или в любой приличной книге по C ).
Ответ №1:
Доступ к элементу предоставляется не для каждого экземпляра, а для каждого класса. В определении класса у вас есть доступ ко всем закрытым членам (любого экземпляра этого класса).
Из cppreference:
Имя каждого члена класса (статического, нестатического, функции, типа и т. Д.) Имеет связанный «доступ к члену». Когда имя члена используется в любом месте программы, его доступ проверяется, и если оно не удовлетворяет правилам доступа, программа не компилируется: […]
Это всего лишь «Объяснение» (примеры следуют далее), но обратите внимание, что в нем указано «имя каждого члена класса», а не «члены объектов».
Небрежно говоря, причина наличия доступа для каждого класса заключается в том, что внутри метода-члена вы должны знать, что вы делаете, прикасаясь к внутренним элементам. Независимо от того, касаетесь ли вы внутренних элементов this
или некоторых other
, это не меняет того факта, что вам нужно знать о внутренней работе типа.
Комментарии:
1. Примечание: на практическом уровне «Доступ к элементу на уровне класса» является логичным выбором для языка. Методы объектов уже тесно связаны с состоянием класса (т. Е. Ваши методы уже должны знать, как работает класс). Таким образом, перекрестный доступ к элементам безопасен.
2. @MartinYork Я подумывал добавить что-то подобное во время написания. Я добавил это сейчас, возможно, это отражает то, что вы говорите.
3.
inside a member method you should know
Roughlt переводится вmembers are "Tightly coupled" with the state of the object"
илиTightly bound
.