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

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

Восстановить пароль Регистрация
 
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 29
01.06.2012, 23:50     Не работает дружественность классов #1
Всем привет, столкнулся с проблемой, не работает дружественность, объявляю вроде все правильно, но что-то идет не так, помогите кто сможет, пожалуйста

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++
std::string код работает в VS 6.0, но не работает в VS2012 (error C4996) C++
C++ не работает дружественность
C++ Дружественность классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Сообщений: 29
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.06.2012, 14:30     Не работает дружественность классов #4
monnzz, Вы можете обратиться к закрытым полям класса Cat из класса Dog, если класс Dog объявлен дружественным классу Cat ( передаете объект класса Cat в функцию член клаccа Dog и обращаетесь к закрытым полям через объект или же можно обратиться к закрытым статическим полям класса Cat).
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 29
02.06.2012, 14:40  [ТС]     Не работает дружественность классов #5
ForEveR спасибо, теперь понял, просто я думал, что у меня происходит расширение и я могу обращаться к данным класса Сat через методы класса Dog напрямую, то есть не зайдействуя объект))

antoha398
Извините, я просто недопонял, что Вы хотели до меня донести))
Yandex
Объявления
02.06.2012, 14:40     Не работает дружественность классов
Ответ Создать тему
Опции темы

Текущее время: 08:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru