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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Сделал я себе вызов написать джунгли из ООП деревьев, типо, объекты обмениваются между собой сообщениями используя их уникальный 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
166 / 109 / 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
166 / 109 / 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
166 / 109 / 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
166 / 109 / 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
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
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
02.12.2018, 13:39
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
Copyright ©2000 - 2024, CyberForum.ru