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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2022, 14:58   #1
Huseyn AX
Пользователь
 
Регистрация: 14.11.2021
Сообщений: 43
По умолчанию Взаимно дружественные классы в C++

Код:
#include <iostream>
#include <cstring>
using namespace std;
class Tv
{
private:
    int volume;
    friend class Remote;
public:
    void buzz(Remote &r, const char *s);
    void volup() { volume++; }
    void showname(Remote &r);
};
class Remote
{
private:
    char name[20];
    friend class Tv;
public:
    void volup(Tv &t) { t.volup(); }
    void buzz(const char *s);
};
void Remote::buzz(const char *s)
{
    strncpy(name, s, 19);
}
inline void Tv::buzz(Remote &r, const char *s)
{
    r.buzz(s);
}
inline void Tv::showname(Remote &r)
{
    cout << "Name is " << r.name << endl;
}
int main()
{
    Tv tele;
    Remote pult;
    pult.volup(tele);
    tele.buzz(pult, "C++C++C++");
    tele.showname(pult);
    return 0;
}
Никак не понимаю взаимно дружественные классы, решил попрактиковаться но получил много ошибок:
Код:
CplusplusMain.cpp:10:15: error: 'Remote' has not been declared
   10 |     void buzz(Remote &r, const char *s);
      |               ^~~~~~
CplusplusMain.cpp:12:19: error: 'Remote' has not been declared
   12 |     void showname(Remote &r);
      |                   ^~~~~~
CplusplusMain.cpp:27:13: error: no declaration matches 'void Tv::buzz(Remote&, const char*)'
   27 | inline void Tv::buzz(Remote &r, const char *s)
      |             ^~
CplusplusMain.cpp:10:10: note: candidate is: 'void Tv::buzz(int&, const char*)'
   10 |     void buzz(Remote &r, const char *s);
      |          ^~~~
CplusplusMain.cpp:4:7: note: 'class Tv' defined here
    4 | class Tv
      |       ^~
CplusplusMain.cpp:31:13: error: no declaration matches 'void Tv::showname(Remote&)'
   31 | inline void Tv::showname(Remote &r)
      |             ^~
CplusplusMain.cpp:12:10: note: candidate is: 'void Tv::showname(int&)'    
   12 |     void showname(Remote &r);
      |          ^~~~~~~~
CplusplusMain.cpp:4:7: note: 'class Tv' defined here
    4 | class Tv
      |       ^~
CplusplusMain.cpp: In function 'int main()':
CplusplusMain.cpp:40:15: error: cannot convert 'Remote' to 'int&'
   40 |     tele.buzz(pult, "C++C++C++");
      |               ^~~~
      |               |
      |               Remote
CplusplusMain.cpp:10:23: note:   initializing argument 1 of 'void Tv::buzz(int&, const char*)'
   10 |     void buzz(Remote &r, const char *s);
      |               ~~~~~~~~^
CplusplusMain.cpp:41:19: error: cannot convert 'Remote' to 'int&'
   41 |     tele.showname(pult);
      |                   ^~~~
      |                   |
      |                   Remote
CplusplusMain.cpp:12:27: note:   initializing argument 1 of 'void Tv::showname(int&)'
   12 |     void showname(Remote &r);
      |                   ~~~~~~~~^
Не понимаю почему эти ошибки появляются
Huseyn AX вне форума Ответить с цитированием
Старый 20.11.2022, 15:24   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,770
По умолчанию

Так прочитайте, что вам компилятор написал! Может дойдет что-то... Потом про объвления и предварительные объявления почитайте.
p51x вне форума Ответить с цитированием
Старый 21.11.2022, 09:24   #3
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,016
По умолчанию

Huseyn AX,

Код:
#include <iostream>
#include <cstring>

class Remote;

class Tv
{
    friend class Remote;
private:
    int volume{};
public:
    void buzz(Remote &r, const char *s);
    void volup() { volume++; }
    void showname(Remote &r)const;
};

class Remote
{
    friend class Tv;
private:
    char name[20]{};
public:
    void volup(Tv &t) { t.volup(); }
    void buzz(const char *s);
};

void Remote::buzz(const char *s)
{
    strncpy(name, s, std::size(name)-1);
}

void Tv::buzz(Remote &r, const char *s)
{
    r.buzz(s);
}

void Tv::showname(Remote &r)const
{
    std::cout << "Name is " << r.name << std::endl;
}

int main()
{
    Tv tele;
    Remote pult;
    pult.volup(tele);
    tele.buzz(pult, "C++C++C++");
    tele.showname(pult);
    return 0;
}
Алексей1153 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дружественные классы в C++ Huseyn AX Помощь студентам 6 11.11.2022 09:46
Дружественные классы KT82 Общие вопросы C/C++ 9 09.02.2016 19:20
дружественные классы zla9_kolu4ka Общие вопросы C/C++ 15 28.02.2014 16:53
Дружественные классы и protected Stiker Помощь студентам 1 10.01.2013 00:57
Дружественные функции и классы Opiym Помощь студентам 1 05.04.2010 21:51