![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 11
|
![]()
Всем привет, столкнулся с проблемой, не работает дружественность, объявляю вроде все правильно, но что-то идет не так, помогите кто сможет, пожалуйста
Код:
Программа чисто для понимания сути, специально объявил перекрестную дружественность, понимаю, что объявление в классе Дог другом класса Кэт и не должно работать, но вот почему не работает первый вариант, где я в классе Кэт объявляю дружественным класс Дог ( нужные строки я отметил восклицательными знаками, чтоб проще было их найти) Ошибки появляются следующие, в классе Дог функция int CatAge () const { return itsAge; } пишет, что индетификатор itsAge неопределен, хотя раз класс объявлен дружественным данные-члены должны быть доступны для методов-членов так же еще ошибка cout << Barsik.GetWeight (); но здесь в целом и не должно ничего работать, это я от безвыходности попробовал(( использую среду ВизуалСтудио 2010 Последний раз редактировалось ACE Valery; 02.06.2012 в 00:11. |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 03.01.2011
Сообщений: 49
|
![]()
Так а причём тут неявный доступ к не объявленному в этом классе полю?
Смысл дружественности в том что дружественный класс сможет получить доступ к приватным полям и методам класса. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Код:
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Код:
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 03.01.2011
Сообщений: 49
|
![]()
Он просто что то дружетвеность и наследование немного спутал
![]() |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
Нет. Он не понимает принципов действия механизмов доступа к данным объектов, и к методам классов.
И это та область, которую порой "наследственность" не решает без помощи френдов и явных разрешений контекстов: Код:
Последний раз редактировалось _Bers; 02.06.2012 в 00:54. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 03.01.2011
Сообщений: 49
|
![]()
Это то я тоже понимаю, я просто написал то что у него по коду просматривалось.
Как он хочет чтоб поля и методы чудом появились там где их не должно быть ![]() |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 11
|
![]()
прошу прощения, может я что-то неправильно понял, но разве дружественность работает не следующим образом? насколько я понял из учебников, если объявить один класс дружественным другому, таким образом:
сlass ПервыйКласс { public: friend class ДружественныйКласс то это означает, что ДружественныйКласс имеет теперь полный доступ к любому из членов класса ПервыйКласс, то есть я через функции - члены ДружественныйКласс могу обратиться к переменным-членам ПервыйКласс, что я и пытался сделать в этой проге. в классе Дог нет переменной itsAge зато она есть в классе Кэт, а класс Дог объявлен дружественным классу Кэт и поэтому должен был получить доступ к данным класса Кэт или нет? В чем же суть тогда дружественности, если я не могу получить доступ к данным дружественного класса через методы класса, который был объявлен как дружественный? на функцию GetWeight прошу пока не обращать внимания |
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
Однако! Он имеет лишь доступ к методам и данным, которые существуют в другом классе Методы и данные класса принадлежат только ему, и не являются собственностью его друзей. Друзья могут к ним обращаться, но при этом не являются владельцами этих методов/данных. Ты в своём коде наивно пытался поюзать данные/методы, которые не пренадлежат классу (их там просто нет) Тебе нужно ответить на два вопроса: 1. Как получить доступ к данным объекта? 2. Как получить доступ к методам объекта? |
|
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 11
|
![]()
все, спасибо разобрался)) я, действительно, наивно считал, что если объявить дружественность, то данные одного класса становятся данными другого, а на самом деле суть лишь в том, что я могу обращаться из методов дружественного класса, с помощью объекта класса, который объявляет себе друга, напрямую к приватным данным)) все понял, всем спасибо))
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
не работает relese версия проги и debug работает тока на моем компе | D][mon | C# (си шарп) | 2 | 04.05.2012 20:21 |
Шаблоны и дружественность | MasterSporta | Общие вопросы C/C++ | 5 | 29.05.2011 14:52 |
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? | >>STINGER<< | Помощь студентам | 4 | 08.03.2011 09:56 |
Библиотека НЕ работает с 2008, но работает с 2000 SQL | namenike | Общие вопросы C/C++ | 0 | 26.05.2009 11:04 |
Создание классов и использование объектов классов при написании программ в среде C++. | Frozen inside | Помощь студентам | 0 | 16.04.2009 23:18 |