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

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

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

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

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 2
а что по вашему должно вернуться из этой функции?
Какое значение?
Код бессмыслен.

если ее подправить вот так:
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  [ТС] 3
прошу прощения, может я что-то неправильно понял, но какой смысл тогда дружественности класса? насколько я понял из учебников, если объявить один класс дружественным другому, таким образом:

с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 4
monnzz, Вы можете обратиться к закрытым полям класса Cat из класса Dog, если класс Dog объявлен дружественным классу Cat ( передаете объект класса Cat в функцию член клаccа Dog и обращаетесь к закрытым полям через объект или же можно обратиться к закрытым статическим полям класса Cat).
1
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
02.06.2012, 14:40  [ТС] 5
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
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Что нового в C# 14
UnmanagedCoder 10.03.2025
Предстоящая версия C# 14 обещает принести изменения, которые сделают разработку еще более приятной и эффективной. Что стоит отметить, так это влияние сообщества разработчиков на формирование новых. . .
Формулы поворота
Igor3D 10.03.2025
Добрый день Тема Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости". x' = x * cos(a) - y * sin(a) y' = y * cos(a) + x * sin(a) Как бы Вы их. . .
Что нового в .NET 10
UnmanagedCoder 10.03.2025
. NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация. . .
Отложенное высвобождение, RCU и Hazard Pointer в C++26
NullReferenced 09.03.2025
Многопоточное программирование стало важной частью современной разработки. Когда несколько потоков одновременно работают с общими данными, возникает целый ряд проблем, связанных с синхронизацией и. . .
Неблокирующийся стек на C++26
NullReferenced 09.03.2025
Традиционные способы синхронизации в многопоточном программировании — мьютексы, семафоры, условные переменные — часто превращаются в узкое место в плане производительности. При этом неблокирующиеся. . .
Обработка строк в C++26: Новые возможности string и string_view
NullReferenced 09.03.2025
Новый стандарт C++26 предлагает много улучшений для работы с привычными string и относительно новыми string_view. string_view - это невладеющая ссылка на последовательность символов, появившаяся в. . .
Мой первый аддон для Blender 3D, с помощью нейронки (не зная даже азов пайтона, но это не значит что так и с остальным).
Hrethgir 09.03.2025
Потратил весь день. Пол-дня мне хватило, чтобы понять что с версией с 14B мне не одолеть написание функционального кода, на языке с которым я вообще никак не знаком - пайтон. Версия 22B от другого. . .
Einstein@Home сегодня исполняется двадцать лет!
Programma_Boinc 09.03.2025
Einstein@Home сегодня исполняется двадцать лет! Отправлено 19 февраля 2025 года в 17:20:21 UTC Я хочу поздравить всех наших волонтеров, разработчиков и ученых из Einstein@Home. Мы официально. . .
Заполнители и расширенный набор символов в C++26
NullReferenced 09.03.2025
C++26 представляет два важных обновления: заполнители и расширенный набор символов. Заполнители (placeholders) решают давнюю проблему лаконичности кода в шаблонных выражениях и лямбда-функциях. Они. . .
Контракты в C++26
NullReferenced 09.03.2025
Контракты – это механизм, позволяющий указывать предусловия, постусловия и инварианты для функций в коде. Эта функциональность должна была стать частью C++20, но была исключена на встрече комитета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru