Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 24.10.2017
Сообщений: 43
1

Проблемы с friend-функциями

18.02.2019, 16:55. Просмотров 1385. Ответов 4
Метки нет (Все метки)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T> class Event{
    public:
        Event& operator= (void (*EventBody)(T*Parent)){
            this->EventBody=EventBody;
            return *this;
        }
    private:
        void (*EventBody)(T*Parent) = nullptr;
        template <class V> friend void Execute(Event<V>& CurrentEvent, V*Parent);
};
class Counter{
    public:
        Event <Counter> OnEvent;
        void start(){
            Execute(OnEvent, this);
        }
    private:
        template <class T> void Execute(Event<T>& CurrentEvent, T* Parent){
            CurrentEvent.EventBody(Parent);
        }
};
Существует следующий код, который по непонятной мне причине отказывается компилироваться вот с таким сообщением:
"events_prototype.cpp:9:39: note: previous declaration 'void (* Event<T>::EventBody)(T*)'
void (*EventBody)(T*Parent) = nullptr;"
Однако как только указатель на функцию становится public, ошибка тут же исчезает. Однако в чём тогда смысл friend-функции? Код выполняется компилятором из комплекта mingw-64, ide VS Code со скачанным расширением для плюсов. Прошу помочь разобраться.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2019, 16:55
Ответы с готовыми решениями:

Перегрузка операторов, friend или нет friend?
Всем здравствуйте. Есть такой вопрос: при перегрузке операторов в классе(пусть будут + и = (вообще...

Friend для friend
всем доброго времени суток, покажу проблему на примере: Class B; class A{ int F; friend B;...

Проблемы с функциями и #VALUE!
Привет всем! У меня в книге макросом создаются несколько листов, так вот при удалении любого из...

Возникли проблемы с функциями
Здраствуйте все. Я нуждаю в помощи по функциям столкнулся вот с какой проблемой вот сама задача...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
4
"C with Classes"
1622 / 1245 / 474
Регистрация: 16.08.2014
Сообщений: 5,222
Записей в блоге: 1
18.02.2019, 17:12 2
RomanQed,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T> class Event{
    public:
        Event& operator= (void (*EventBody)(T*Parent)){
            this->EventBody=EventBody;
            return *this;
        }
    private:
        void (*EventBody)(T*Parent) = nullptr;
        friend class Counter;
};
class Counter{
    public:
        Event <Counter> OnEvent;
        void start(){
            Execute(OnEvent, this);
        }
    private:
        template <class T> void Execute(Event<T>& CurrentEvent, T* Parent){
            CurrentEvent.EventBody(Parent);
        }
};
0
14042 / 7523 / 1781
Регистрация: 30.01.2014
Сообщений: 12,580
18.02.2019, 18:21 3
RomanQed, у вас friend-функцией объявлена совсем не та функция, из которой вы пытаетесь получить доступ.
0
0 / 0 / 0
Регистрация: 24.10.2017
Сообщений: 43
18.02.2019, 19:07  [ТС] 4
Т.е. Execute в классе Counter считается в данном случае абсолютно другой функцией? А как мне тогда явно указать реализацию friend-функции?
0
14042 / 7523 / 1781
Регистрация: 30.01.2014
Сообщений: 12,580
18.02.2019, 20:16 5
Лучший ответ Сообщение было отмечено RomanQed как решение

Решение

Цитата Сообщение от RomanQed Посмотреть сообщение
Т.е. Execute в классе Counter считается в данном случае абсолютно другой функцией?
Тут friend`ом стала внешняя (свободная) функция, определения которой нет. И она никогда не вызывается в этом коде.

Цитата Сообщение от RomanQed Посмотреть сообщение
А как мне тогда явно указать реализацию friend-функции?
Из кода не очень понятно какой вариант должен считаться корректным. Вот так - вас устроит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class T> class Event{
    public:
        Event& operator= (void (*EventBody)(T *)){
            this->EventBody=EventBody;
            return *this;
        }
    private:
        void (*EventBody)(T*Parent) = nullptr;
    
        friend void T::template Execute<>(Event<T>& CurrentEvent, T * Parent);
};
class Counter{
    public:
        Event <Counter> OnEvent;
        void start(){
            Execute(OnEvent, this);
        }
    private:
        template <class T> void Execute(Event<T>& CurrentEvent, T* Parent){
            CurrentEvent.EventBody(Parent);
        }
};
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2019, 20:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Проблемы с функциями xml
Вот код двух функции которые взаимосвязаны по всему сайту они работают нормально а в коментариях...

Tkinter, .place_forget() и проблемы с функциями
from tkinter import * root = Tk() root.iconbitmap('rust.ico') root.title('COTAORFE') c =...

В чем различие между функциями VBA и функциями Excel?
В чем различие между функциями VBA и функциями Excel. Скажите пожалуйста , в гугле не могу найти)

friend class
#include &lt;iostream&gt; using namespace std; #include &lt;string&gt; using std::string; class two; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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