Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2012, 23:57   #1
monnzz
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию не работает дружественность классов

Всем привет, столкнулся с проблемой, не работает дружественность, объявляю вроде все правильно, но что-то идет не так, помогите кто сможет, пожалуйста

Код:
 #include "stdafx.h"
 #include <iostream>
 using namespace std;

 class Cat 
 {
 public:
 friend class Dog; !!!!!!!!!!!!!!!!!!!!!!!!!!!!
 Cat () {}
 ~Cat () {}
 void SetAge (int age) { itsAge = age; }
 int GetAge () const { return itsAge; }
 private:
 int itsAge;
 };

 class Dog
 {
 public:
 friend class Cat; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 Dog (int weight) {itsWeight = weight; }
 ~Dog () {}
 int CatAge () const { return itsAge; } !!!!!!!!!!!!! (внимание на itsAge)
 int GetWeight () const { return itsWeight; }
 private:
 int itsWeight;
 };

 int main ()
 {
 Cat Barsik;
 Barsik.SetAge (10);
 Dog Frisky (134);
 cout << Frisky.CatAge ();
 cout << Barsik.GetWeight ();
 char response;
 cin >> response;
 return 0;
 }

Программа чисто для понимания сути, специально объявил перекрестную дружественность, понимаю, что объявление в классе Дог другом класса Кэт и не должно работать, но вот почему не работает первый вариант, где я в классе Кэт объявляю дружественным класс Дог ( нужные строки я отметил восклицательными знаками, чтоб проще было их найти)

Ошибки появляются следующие, в классе Дог функция int CatAge () const { return itsAge; } пишет, что индетификатор itsAge неопределен, хотя раз класс объявлен дружественным данные-члены должны быть доступны для методов-членов

так же еще ошибка cout << Barsik.GetWeight (); но здесь в целом и не должно ничего работать, это я от безвыходности попробовал((

использую среду ВизуалСтудио 2010

Последний раз редактировалось ACE Valery; 02.06.2012 в 00:11.
monnzz вне форума Ответить с цитированием
Старый 02.06.2012, 00:20   #2
zvoronz
Пользователь
 
Регистрация: 03.01.2011
Сообщений: 49
По умолчанию

Так а причём тут неявный доступ к не объявленному в этом классе полю?
Смысл дружественности в том что дружественный класс сможет получить доступ к приватным полям и методам класса.
zvoronz вне форума Ответить с цитированием
Старый 02.06.2012, 00:27   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
class Dog
 {
 public:
 friend class Cat; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 Dog (int weight) {itsWeight = weight; }
 ~Dog () {}
 int CatAge () const { return itsAge; } !!!!!!!!!!!!! (внимание на itsAge)
 ...
Где в классе Dog объявлена переменная itsAge?
_Bers вне форума Ответить с цитированием
Старый 02.06.2012, 00:29   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
Cat Barsik;
 Barsik.SetAge (10);
 Dog Frisky (134);
 cout << Frisky.CatAge ();
 cout << Barsik.GetWeight ();
 ...
В классе Cat отсутствует метод GetWeight ();
_Bers вне форума Ответить с цитированием
Старый 02.06.2012, 00:43   #5
zvoronz
Пользователь
 
Регистрация: 03.01.2011
Сообщений: 49
По умолчанию

Он просто что то дружетвеность и наследование немного спутал
zvoronz вне форума Ответить с цитированием
Старый 02.06.2012, 00:52   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от zvoronz Посмотреть сообщение
Он просто что то дружетвеность и наследование немного спутал
Нет. Он не понимает принципов действия механизмов доступа к данным объектов, и к методам классов.


И это та область, которую порой "наследственность" не решает без помощи френдов и явных разрешений контекстов:

Код:
struct Foo
{
    int mTest;
};

class Bar
{
    int mTest;
};

class Test:public Foo, public Bar
{
     Test() {/*хочу получить доступ к мемберам Bar*/}
};

Последний раз редактировалось _Bers; 02.06.2012 в 00:54.
_Bers вне форума Ответить с цитированием
Старый 02.06.2012, 01:06   #7
zvoronz
Пользователь
 
Регистрация: 03.01.2011
Сообщений: 49
По умолчанию

Это то я тоже понимаю, я просто написал то что у него по коду просматривалось.
Как он хочет чтоб поля и методы чудом появились там где их не должно быть
zvoronz вне форума Ответить с цитированием
Старый 02.06.2012, 14:30   #8
monnzz
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

прошу прощения, может я что-то неправильно понял, но разве дружественность работает не следующим образом? насколько я понял из учебников, если объявить один класс дружественным другому, таким образом:

сlass ПервыйКласс
{
public:
friend class ДружественныйКласс

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

в классе Дог нет переменной itsAge зато она есть в классе Кэт, а класс Дог объявлен дружественным классу Кэт и поэтому должен был получить доступ к данным класса Кэт или нет? В чем же суть тогда дружественности, если я не могу получить доступ к данным дружественного класса через методы класса, который был объявлен как дружественный?

на функцию GetWeight прошу пока не обращать внимания
monnzz вне форума Ответить с цитированием
Старый 02.06.2012, 15:14   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от monnzz Посмотреть сообщение
прошу прощения, может я что-то неправильно понял, но разве дружественность работает не следующим образом? насколько я понял из учебников, если объявить один класс дружественным другому, таким образом:

сlass ПервыйКласс
{
public:
friend class ДружественныйКласс

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

в классе Дог нет переменной itsAge зато она есть в классе Кэт, а класс Дог объявлен дружественным классу Кэт и поэтому должен был получить доступ к данным класса Кэт или нет? В чем же суть тогда дружественности, если я не могу получить доступ к данным дружественного класса через методы класса, который был объявлен как дружественный?

на функцию GetWeight прошу пока не обращать внимания
Если первый класс является другом второго класса, то первый класс имеет полный доступ к методам/данным второго класса.

Однако! Он имеет лишь доступ к методам и данным, которые существуют в другом классе

Методы и данные класса принадлежат только ему, и не являются собственностью его друзей.

Друзья могут к ним обращаться, но при этом не являются владельцами этих методов/данных.


Ты в своём коде наивно пытался поюзать данные/методы, которые не пренадлежат классу (их там просто нет)


Тебе нужно ответить на два вопроса:

1. Как получить доступ к данным объекта?
2. Как получить доступ к методам объекта?
_Bers вне форума Ответить с цитированием
Старый 02.06.2012, 16:00   #10
monnzz
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает 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