![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Alexey91 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Компилятор начинает выдавать ошибки, если я в базовом классе, использую protected и он выдает следующее:
In member function `virtual Tlist* Tque::addlist(Tlist*)': 13: error: `Tlist*Tlist::next' is protected 288: error: within this context 13: error: `Tlist*Tlist::next' is protected 289: error: within this context In member function `virtual Tlist* Tque::del_(Tlist*)': 13: error: `Tlist*Tlist::next' is protected 300: error: within this context In member function `virtual Tlist* Tst::addlist(Tlist*)': 12: error: `int Tlist::data' is protected 321: error: within this context 13: error: `Tlist*Tlist::next' is protected 323: error: within this context Я читаю, что спецификатор protected дает возможность использовать поля данных методам базового класса и всех его производных. Но в производном класс Tque, его методы при обращении к данным из базового класса не могут получить доступ, и компилятор выдает ошибки, которые я написал выше. Не понимаю почеемму.. Программа будет работать если спецификатор protected заменить на public
Всех спрашиваю, никто не может понять в чем дело.. Это сообщение отредактировал(а) Alexey91 - 4.10.2010, 11:20 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
я так понимаю, ты делаешь односвязный список. правильно? Так вот, объект список содержит только два указателя - на первый элемент списка и на последний. А вот элемент списка содержит данные, указатель на следующий элемент и предыдущий (только двусвязный). Все это должно быть приватным. Наружу должны торчать только методы. А ты все запихал в один класс.
Более того, список просто не может быть базовым классом. Зачем? Список он и есть список. protected означает, что доступ к полям объекта запрещен из вне этого объекта. т.е. this->next можно, а t->next нельзя. |
|||
|
||||
Alexey91 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Это вообще программа из лабораторной.
Нужно было реализовать классы для списка, очереди, и стека, вот поэтому я список и через класс и делаю.. Но я так и не понял, в чем здесь ошибка? А описание protected я из лекций взял..
Под объектом вы понимаете, например Tlist B или class Tlist ? А то, что методы производных классов имеют доступ к данным базового класса это неверно?
Это сообщение отредактировал(а) Alexey91 - 4.10.2010, 11:36 |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
имеют. но они имеют только по указателю this.
это не объекты. это классы. А объекты, это такие переменные. Обычно, protected используется для защиты виртуальных методов от доступа снаружи. Т.е. ты в базовом классе делаешь ряд виртуальных методов (в т.ч. и чисто виртуальных), которые наследники переопределяют. "Пользовательский" код не имеет прямого доступа к этим методам. Более того, он ему и не нужен (если все грамотно спроектировано). Свойства класса вообще помещать нужно в приватную область, чтобы никто, кроме этого класса, доступа туда не имел. В этом случае ты обезопасишь себя от кучи проблем, которые могут возникнуть при изменении набора свойств. Например, ты написал односвязный список и десять наследников, которые напрямую меняют поля next, head, tail... А потом тебе понадобилось сделать его двусвязным... И тебе придется менять это не только в нем, но еще и в 10 наследниках. А если грамотно писать, то менять придется только в нем самом, так как наследники используют только методы. Это сообщение отредактировал(а) bsa - 4.10.2010, 11:41 |
|||
|
||||
Alexey91 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
так.. я правильно понимаю
что в функции a(), мы используем x производного класса? а в функции b мы пытаемся обратиться к х из базового класса, но к полю х мы обратиться из производного класса не можем, потому что находимся вне объекта типа class X? Указатель this присваивается неявно методу, в нем содержится адрес вызываемого объекта. Это сообщение отредактировал(а) Alexey91 - 4.10.2010, 12:01 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Alexey91 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Может кто-нибудь дать четкое определение protected со всеми нюансами, а то я совсем запутался
![]() |
|||
|
||||
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Добавлено @ 12:33 вот пример, чтоб легче было разобраться
Добавлено @ 12:35
Модератор: добавил наследование от A Это сообщение отредактировал(а) bsa - 4.10.2010, 12:40 |
||||||||
|
|||||||||
Alexey91 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
угу, пока буду думать!!
|
|||
|
||||
Alexey91 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Мы здесь обращаемся к унаследованному полю i в классе B. А как обращаться из класса B к элементу i из класса А? bsa говорил, что мы можем обращаться из производного класса в базовый класс, но по указателю this. Или я его неправильно понял. Обычно обращался так: имя_объекта.имя_класса::имя_компонента . имя_объекта.имя_элемента Это сообщение отредактировал(а) Alexey91 - 4.10.2010, 13:05 |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если он protected, то никак (исключение для друзей) можно только к унаследованным протектед членам.. объект роли не играет, важен его тип..
Это сообщение отредактировал(а) mes - 4.10.2010, 13:35 |
||||||
|
|||||||
Alexey91 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
т.е. мы можем обращаться только к более низшим по иерархии классам? Из класса А мы можем обратиться к protected полям из класса B? Не ясно как это можно сделать..
Исправьте пожалуйста, я mes не те звездочки (ОТРИЦАТЕЛЬНЫЕ) поставил ((( Это сообщение отредактировал(а) Alexey91 - 4.10.2010, 14:16 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Alexey91 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Как можно обратиться к унаследованным протектед членам (или под членом вы понимаете функцию-член)? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
к унаследованным ты можешь обратиться напрямую. Но доступа к неунаследованным у тебя нет. Т.е. если ты из класса B (наследника A) пытаешься изменить защищенное свойство объекта, класса A, то получишь от компилятора по рукам. А если пытаешься изменить тоже самое свойство, но от объекта класса B, то все будет в порядке.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |