Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
1

Хранение в map указателя на функцию-член шаблонного класса

02.12.2018, 05:53. Показов 1208. Ответов 10
Метки нет (Все метки)

Здравствуйте! Сделал я себе вызов написать джунгли из ООП деревьев, типо, объекты обмениваются между собой сообщениями используя их уникальный id.(Это очень опасный код, особенно из-за указателей типа void) Они должны обмениваться сообщениями через дружественную функцию шаблонному классу InternetThing:
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
template<class A>
class InternetThing
{
    protected:
    
    vector<Packet<A>> receivedData;
    virtual void catchReceivedData(Packet<A> data) = 0;
    void receive(void* packetToReceive) // <---
    {
        Packet<A>* receivedData = static_cast<Packet<A>*>(packetToReceive);
        this->receivedData.push_back(*receivedData);
        catchReceivedData(*receivedData);
    }
    unsigned short id;
 
    void connectToNet()
    {
        net[id] = receive;
    }
 
    template<class B>
    friend void send(Packet<B> packet);
 
};
Функция receive должна передавать пакет
C++
1
2
3
4
5
6
7
template<class A>
struct Packet
{
    unsigned short senderId;
    unsigned short receiverId;
    A              data;
};
Пакетами объекты должны обмениваться через вот эту функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class B>
void send(Packet<B> packet)
{
    for(map<unsigned short, void(*)(void*)>::iterator i = net.begin(); i != net.end(); ++i)
    {
        if(i->first == packet.receiverId)
        {
            void* receivedDataa = &packet;
            i->second(receivedDataa);
        }
    }
}
Он работает с картой net:
C++
1
map<unsigned short, void(*)(void*)> net;
Компилятор выдаёт ошибку:
error: cannot convert ‘InternetThing<bool>::receive’ from type ‘void (InternetThing<bool>:(void*)’ to type ‘std::map<short unsigned int, void (*)(void*)>::mapped_type {aka void (*)(void*)}’
net[id] = receive;
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2018, 05:53
Ответы с готовыми решениями:

Передача указателя на функцию-член класса
Необходимо передать фунцию-член класса как аргумент в функцию другого класса. Код: Файл...

Функция-член шаблонного класса
Как правильно объявить функцию-член шаблонного класса? Класс: template &lt;class SType&gt; class Set...

Хранение неинициализированных объектов шаблонного класса
Допустим, есть шаблонный класс template &lt;typename T&gt; class SomeValue; который хранит в себе...

Использование указателя на объект шаблонного класса в шаблонном классе.
Всем привет! Мне нужно реализовать граф. Начал с вершин и ребер, причем и ребра и вершины -...

10
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
02.12.2018, 07:06 2
Не знаю, что там происходит.
Это указатель на функцию или что это ?
Цитата Сообщение от kcalbCube Посмотреть сообщение
void(*)(void*)
Но здесь
Цитата Сообщение от kcalbCube Посмотреть сообщение
i->second(receivedDataa);
подразумевалось наверняка вот так

C++
1
i->second =receivedDataa;
0
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
02.12.2018, 07:09  [ТС] 3
Да, это указатель на функцию. в
C++
1
i->second(receivedDataa)
Подразумевается вызов функции для передачи данных в объект. Не понимаю как заставить эту жигули работать
0
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
02.12.2018, 07:13 4
Это
C++
1
2
3
4
5
6
7
8
  for(map<unsigned short, void(*)(void*)>::iterator i = net.begin(); i != net.end(); ++i)
    {
        if(i->first == packet.receiverId)
        {
            void* receivedDataa = &packet;
            i->second(receivedDataa);
        }
    }
можно заменить на одну строку

C++
1
net[packet.senderId] = receivedDataa;
Результат будет одинаковым.

Добавлено через 2 минуты
Цитата Сообщение от kcalbCube Посмотреть сообщение
Да, это указатель на функцию. в
Но это ведь совсем не адрес функции
Цитата Сообщение от kcalbCube Посмотреть сообщение
&packet
Это адрес объекта.
0
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
02.12.2018, 07:15  [ТС] 5
А если id будет не существующим? Да и как эта штука вообще найдёт нужный объект если не будет искать его id в карте?

Ответ на "Но это ведь совсем не адрес функции"
Это должен быть адрес на функцию receive в объекте класса наследуемого от InternetThing
0
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
02.12.2018, 07:17 6
Цитата Сообщение от kcalbCube Посмотреть сообщение
А если id будет не существующим?
Если такой id не существует, то в std::map будет добавлен и ключ (id) и значение.
Если id существует, то перепишется значение.
0
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
02.12.2018, 07:20  [ТС] 7
send Должен вызывать функцию из адреса функции из карты net хранящей адреса функций под их id

Добавлено через -1 минуту
Функция send Должен вызывать функцию из карты net по id переданный в неё. Если не найдено то ничего не делать, id берётся из Пакета, а именно из receiverId
0
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
02.12.2018, 07:21 8
Вызвать, тогда вас не понял.
0
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
02.12.2018, 07:25  [ТС] 9
Структура пакета:
Цитата Сообщение от kcalbCube Посмотреть сообщение
Функция receive должна передавать пакет
C++
1
2
3
4
5
6
7
template<class A>
struct Packet
{
* * unsigned short senderId;
* * unsigned short receiverId;
* * A * * * * * * *data;
};
Добавлено через 33 секунды
Вдруг откуда не возьмись, появились вдруг звёзды

Добавлено через 2 минуты
Так вот, оно пишит что невозможно конвертировать void (InternetThing<bool>:(void*) в void (*)(void*)}
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
02.12.2018, 09:26 10
kcalbCube, указатель на функцию и указатель на метод класса - это разные вещи, одно к другому не преобразовать. При этом во втором случае еще и требуется указатель на объект, для которого будет вызываться данный метод.

Добавлено через 1 минуту
Как вариант можно посмотреть в сторону использования std::function.
0
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
02.12.2018, 13:39  [ТС] 11
Тема закрыта! Всё решилось костылём --- Теперь появилась структура Data хранящая некоторые переменные разных типов данных, и в пакете указывается тип данных который должен использоваться. Теперь работает замечательно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2018, 13:39

Хранение вектора экземпляров шаблонного класса неизвестного типа
Здравствуйте! Потребовалось хранить вектор экземпляров шаблонного класса неизвестного типа. Для...

Указатель на объект из указателя на член класса
Что как-то сей вопрос ставит меня в тупик. class A { int i; } obj; int main()

Перевод указателя на член класса в обычный указатель
Добрый день. Есть некоторый API, который принимает обычные указатели на функцию и поэтому при...

Передача указателя на функцию-член
Всем привет ! Необходимо передать функцию-член в качестве параметра другой функции-члену....

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); }...

Как определить дружественную функцию шаблонного класса?
Подскажите, пожалуйста, как определить дружественную функцию какого-то определенного шаблона? ...


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

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

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