С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34

Не работает дружественность классов

01.06.2012, 23:50. Показов 1219. Ответов 4
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 #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
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2012, 23:50
Ответы с готовыми решениями:

Дружественность классов
Просьба помочь горе-программисту. Проблема: есть дружественный класс Interface, который не видит НИЧЕГО из основного класса List ...

не работает дружественность
Привожу пример тривиального кода, будем считать что все что надо уже перегружено: class B; class A { friend class B; ...

Дружественность...
Можно ли наследовать дружественность? Т.е. есть класс А, наследуемый от B. Могу ли я в классе B написать friend class С, так чтобы все...

4
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
02.06.2012, 00:38
а что по вашему должно вернуться из этой функции?
Какое значение?
Код бессмыслен.

если ее подправить вот так:
C++
1
int CatAge (Cat &tmp) const { return tmp.itsAge; }
а вызывать так:
C++
1
2
3
4
Cat Barsik;
 Barsik.SetAge (10);
 Dog Frisky (134);
 cout << Frisky.CatAge (Barsik);
тогда получим возраст барсика)

Или же itsAge должна быть статической переменной, тогда к ней мы можем обратиться так
C++
1
return Cat::itsAge
Но в этом случае она будет одинакова для всех объектов типа Cat
1
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
02.06.2012, 14:18  [ТС]
прошу прощения, может я что-то неправильно понял, но какой смысл тогда дружественности класса? насколько я понял из учебников, если объявить один класс дружественным другому, таким образом:

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

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


я попробывал Ваш вариант, все работает, но проблема в том, что это работает и без объявления дружественности, можно написать код так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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 (Cat & t) const { return t.GetAge (); }
    int GetWeight () const { return itsWeight; }
private:
    int itsWeight;
};
 
int main ()
{}
    Cat Barsik;
    Barsik.SetAge (10);
    Dog Frisky (134);
    cout << Frisky.CatAge (Barsik);
    //cout << Barsik.GetWeight ();
    char response;
    cin >> response;
    return 0;

я закомментировал объявление дружественности и поправил код как Вы сказали, все заработало,но тут я не удивлен. Другое дело какое это отношение имеет к дружественности?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.06.2012, 14:30
monnzz, Вы можете обратиться к закрытым полям класса Cat из класса Dog, если класс Dog объявлен дружественным классу Cat ( передаете объект класса Cat в функцию член клаccа Dog и обращаетесь к закрытым полям через объект или же можно обратиться к закрытым статическим полям класса Cat).
1
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
02.06.2012, 14:40  [ТС]
ForEveR спасибо, теперь понял, просто я думал, что у меня происходит расширение и я могу обращаться к данным класса Сat через методы класса Dog напрямую, то есть не зайдействуя объект))

antoha398
Извините, я просто недопонял, что Вы хотели до меня донести))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2012, 14:40
Помогаю со студенческими работами здесь

Шаблоны и дружественность. Перегрузка оператора << через дружественную функцию в шаблоне
Доброго времени суток, уважаемые форумчане! Есть класс-шаблон, реализующий объект &quot;Матрица&quot;. Для него перегружены некоторые...

Не работает предопределение классов
вот код: class A; class B { A a; A b; }; class A {

Не работает один из классов
Задание. Цикл с параметром - FOR: Для геометрической прогрессии 2, 6, 18, 54, 162 ... определить первые n членов этой прогрессии. При...

Проверить два числа на "дружественность"
Assembler. Даны два натуральных числа A и B. Если они являются дружественными вывести True, иначе вывести False.

Не работает инициализация классов
Всем привет, собственно решил изучить виртуальные функции и наткнулся на такую проблему: Test.h #ifndef TEST_H #define...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru