Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
#1

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

01.06.2012, 23:50. Просмотров 589. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2012, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает дружественность классов (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
antoha398
155 / 155 / 3
Регистрация: 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
monnzz
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;

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

antoha398
Извините, я просто недопонял, что Вы хотели до меня донести))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2012, 14:40
Привет! Вот еще темы с ответами:

Наследование классов. Не работает вывод площади - C++
Не выводит площадь треугольника. От линии наследуется треугольник. Код прилагается #include&lt;iostream&gt; using namespace std; class...

Почему RTTI работает только с иерархией классов, содержащие виртуальные функции? - C++
Почему RTTI работает только с иерархией классов, содержащие виртуальные функции?

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов - C++
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение, демонстрирующее работу с коллекцией объектов...

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов) - C++
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как вынести методы из классов Panel и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.06.2012, 14:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru