Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с типами данных 
:(
    Опции темы
rcdimon
Дата 9.12.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Всем привет. 

Мне необходимо как-то хранить в массиве или другой структуре ссылки на различные функции. Для того чтобы можно было в цикле обойти этот массив и вызвать эти функции. Функции могут быть самыми разнообразными, но входные параметры у них всех одинаковые. Разные тела функций.

Если быть точнее, то дело обстоит так:

Создается объект. При этом вызывается его конструктор, который должен "регистрироваться" в некой структуре данных. Удобнее всего сделать для этого свою функцию и конструктор обращается к ней, передавая некоторые параметры, среди которых ссылка на один из своих методов.

Далее программа работает и когда происходит определенное событие необходимо вызвать все методы всех объектов которые "зарегистрировались" тогда.

Трудность заключается в том, что у меня опыт программирования на С++ еще маленький... Как сделать ссылку на метод объекта я еще могу догадаться, но проблема в том что в том массиве, куда надо засунуть эти ссылки все элементы должны быть одного типа, а функции все разные, следовательно и ссылки на них разного типа.. как засунуть их в один массив не понимаю.

Подскажите, пожалуйста, как быть.
PM MAIL ICQ   Вверх
archimed7592
Дата 9.12.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Ммм... Не понял. Ты определись, ф-ции имеют одинаковые сигнатуры или разные?
Одинаковые - это так:
Код

int foo(int i, char c) << сигнатура
{
  /* ... */
}

int bar(int myI, char yourC) << сигнатура
{
  /* ... */
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
rcdimon
Дата 9.12.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Ну это методы объектов. Входные параметры одинаковые можно сделать. Имя метода тоже можно сделать одинаковым
PM MAIL ICQ   Вверх
archimed7592
Дата 9.12.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Типы объектов разные?

Это сообщение отредактировал(а) archimed7592 - 9.12.2007, 19:46


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
rcdimon
Дата 9.12.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Вот объекты да... могут быть самыми различными..

Вообще для чего мне это- я пишу системную библиотеку на С++ для операционной системы Kolibri OS... И делаю объектный интерфейс с различным визуальным компонентам... кнопкам, чек боксам и т.д... Один объект- один элемент... При создании объекта он регистрируется, говоря системе о том какие события он хочет получать от системы... а когда они происходят система должна сообщать об этом компоненту, вызывая его обработчик событий
PM MAIL ICQ   Вверх
archimed7592
Дата 9.12.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Ааа, ну тогда есть два варианта развития событий:
1. Написание своего узкоспециализированного велосипеда.
2. Использование массива boost::function.

Для первого придётся разобраться с шаблонами.
Для второго придётся скачать несколько мегобайт и распаковать в определённую папку.

По времени одно и то же, только второй вариант более универсальный(читай почти ничем не ограничен).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
rcdimon
Дата 9.12.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Дело в том что вся графическая операционка Kolibri OS с кучей приложений влезает на дискету ) Если я буду использовать какую-то штуку размером в песколько мегабайт в своей библиотеки люди меня не поймут )

Добавлено через 1 минуту и 48 секунд
Я вообще не могу использовать никакие стандартные библиотеки... так как их нет в Kolibri OS и вообще там сделано все совсем иначе...

Библиотека моя- всего лишь обертка на операторы _asm {} в теле которых находятся системные вызовы ядра жтой ОС...
PM MAIL ICQ   Вверх
bsa
Дата 9.12.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



А компилятор какой?
PM   Вверх
rcdimon
Дата 9.12.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Visual C++

Добавлено через 1 минуту и 26 секунд
Если интересно как их под VC потом все работает под Kolibri OS- есть специальная программка, которая заголовки у бинарников меняет... и еще там что-то переделывает... и после этого бинарник запускается спокойно под Kolibri.... главное чтоб не использовал ничего виндозного
PM MAIL ICQ   Вверх
bsa
Дата 10.12.2007, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



rcdimon, бери boost::function. Это просто заголовочный файл по сути.
PM   Вверх
rcdimon
Дата 10.12.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Если можно, привидите, пожалуйста, пример с его использованием
PM MAIL ICQ   Вверх
archimed7592
Дата 10.12.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Код

#include <boost/function.hpp>
#include <boost/bind.hpp>

// ...
struct S1
{
  int f1(char c, bool b)
  { /* ... */ }
};

struct S2
{
  int f2(char c, bool b)
  { /* ... */ }
};

// ...
typedef boost::function< int(char, bool) > callback;
callback callbacks[2];
S1 s1;
S2 s2;
callbacks[0] = boost::bind(&S1::f1, &s1);
callbacks[1] = boost::bind(&S2::f2, &s2);

int results[2];
for (int i = 0; i < 2; ++i)
   results[i] = callbacks[i](i, i % 2 != 0);



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
rcdimon
Дата 10.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Пишет что у меня нет такой библиотеки... где ее можно скачать?
PM MAIL ICQ   Вверх
archimed7592
Дата 10.12.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



boost.org


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
rcdimon
Дата 10.12.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Эту библиотеку решил не использовать... и обойтись просто ссылками на обычные глобальные функции. Но и тут не все получается.

объявляю класс, один из методов которого должен принимать ссылку на глобальную функцию

Код

class Button {
    public:
        void SetPosition(int x, int y);
        void SetId(int id);
        void SetSize(int width, int height);
        void SetColor(int color);
        void SetCaption(char * caption);
        void Draw(void);
        void BindEvent(void (*EventListener)(int , int , int , int ));
    private:
        int X;
        int Y;
        int Width;
        int Height;
        int Id;
        int Color;
        char *Caption;
};





в ответ ошибка

Цитата

Compiling...
button.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\kolibri\inc\classes\button.cpp(7) : error C2556: 'int __thiscall Button::BindEvent(void (__stdcall *)(int,int,int,int))' : overloaded function differs only by return type from 'void __thiscall Butt
on::BindEvent(void (__stdcall *)(int,int,int,int))'
        c:\program files\microsoft visual studio\myprojects\kolibri\inc\classes\button.h(11) : see declaration of 'BindEvent'
C:\Program Files\Microsoft Visual Studio\MyProjects\kolibri\inc\classes\button.cpp(7) : error C2371: 'BindEvent' : redefinition; different basic types
        c:\program files\microsoft visual studio\myprojects\kolibri\inc\classes\button.h(11) : see declaration of 'BindEvent'
main.cpp
os.cpp
Error executing cl.exe.

kolibri.exe - 2 error(s), 0 warning(s)




в чем дело? Неужели методу нельзя передать в качестве параметра ссылку на функцию?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.