|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.06.2012, 23:57 | #1 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 11
|
не работает дружественность классов
Всем привет, столкнулся с проблемой, не работает дружественность, объявляю вроде все правильно, но что-то идет не так, помогите кто сможет, пожалуйста
Код:
Программа чисто для понимания сути, специально объявил перекрестную дружественность, понимаю, что объявление в классе Дог другом класса Кэт и не должно работать, но вот почему не работает первый вариант, где я в классе Кэт объявляю дружественным класс Дог ( нужные строки я отметил восклицательными знаками, чтоб проще было их найти) Ошибки появляются следующие, в классе Дог функция int CatAge () const { return itsAge; } пишет, что индетификатор itsAge неопределен, хотя раз класс объявлен дружественным данные-члены должны быть доступны для методов-членов так же еще ошибка cout << Barsik.GetWeight (); но здесь в целом и не должно ничего работать, это я от безвыходности попробовал(( использую среду ВизуалСтудио 2010 Последний раз редактировалось ACE Valery; 02.06.2012 в 00:11. |
02.06.2012, 00:20 | #2 |
Пользователь
Регистрация: 03.01.2011
Сообщений: 49
|
Так а причём тут неявный доступ к не объявленному в этом классе полю?
Смысл дружественности в том что дружественный класс сможет получить доступ к приватным полям и методам класса. |
02.06.2012, 00:27 | #3 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Код:
|
02.06.2012, 00:29 | #4 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Код:
|
02.06.2012, 00:43 | #5 |
Пользователь
Регистрация: 03.01.2011
Сообщений: 49
|
Он просто что то дружетвеность и наследование немного спутал
|
02.06.2012, 00:52 | #6 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Нет. Он не понимает принципов действия механизмов доступа к данным объектов, и к методам классов.
И это та область, которую порой "наследственность" не решает без помощи френдов и явных разрешений контекстов: Код:
Последний раз редактировалось _Bers; 02.06.2012 в 00:54. |
02.06.2012, 01:06 | #7 |
Пользователь
Регистрация: 03.01.2011
Сообщений: 49
|
Это то я тоже понимаю, я просто написал то что у него по коду просматривалось.
Как он хочет чтоб поля и методы чудом появились там где их не должно быть |
02.06.2012, 14:30 | #8 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 11
|
прошу прощения, может я что-то неправильно понял, но разве дружественность работает не следующим образом? насколько я понял из учебников, если объявить один класс дружественным другому, таким образом:
сlass ПервыйКласс { public: friend class ДружественныйКласс то это означает, что ДружественныйКласс имеет теперь полный доступ к любому из членов класса ПервыйКласс, то есть я через функции - члены ДружественныйКласс могу обратиться к переменным-членам ПервыйКласс, что я и пытался сделать в этой проге. в классе Дог нет переменной itsAge зато она есть в классе Кэт, а класс Дог объявлен дружественным классу Кэт и поэтому должен был получить доступ к данным класса Кэт или нет? В чем же суть тогда дружественности, если я не могу получить доступ к данным дружественного класса через методы класса, который был объявлен как дружественный? на функцию GetWeight прошу пока не обращать внимания |
02.06.2012, 15:14 | #9 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Однако! Он имеет лишь доступ к методам и данным, которые существуют в другом классе Методы и данные класса принадлежат только ему, и не являются собственностью его друзей. Друзья могут к ним обращаться, но при этом не являются владельцами этих методов/данных. Ты в своём коде наивно пытался поюзать данные/методы, которые не пренадлежат классу (их там просто нет) Тебе нужно ответить на два вопроса: 1. Как получить доступ к данным объекта? 2. Как получить доступ к методам объекта? |
|
02.06.2012, 16:00 | #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 |