Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: отображение string на методы класса  (Прочитано 10194 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 22-08-2009 04:27 » 

отображение string на методы класса

допустим есть класс c несколькими методами, которые берут одинаковые параметы:
Код:
class a {
void f1();
void f2();
void f3();
int fi4(int);
int fi5(int);
}

как создать отображение:
Код:
map<string, ... > m1;
map<string, ... > m2;

// чтобы заработало:
m1["1"]=a::f1;
m1["2"]=a::f2;
m2["4"]=a::fi4;

void fff(a* p,const string& s) {
     p->m1[s];
}

int  fff(a* p,const string& s,int b) {
     return p->m1[s](b);
}
Записан

1n c0de we trust
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 22-08-2009 08:16 » 

Только за это
Цитата
void fff(a* p,const string& s)
int    fff(a* p,const string& s,int b)
Компилятор будет матерится очень долго.

А так смотри в сторону шаблонов и как строить функтор. У себя могу полазить и выложить код. Когда то я баловался, чтоб понять как работает функтор.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 22-08-2009 08:22 » 

с map я не общался ещё,  поэтому string тцда всунуть не получилось (
А так же победить, что нужно линкеру тоже. А компилятор хавает

Код:
#include <map>


class a
{
public:
static void f1(a* pThis);
static void f2(a* pThis);
static void f3(a* pThis);
static int fi4(a* pThis,int);
static int fi5(a* pThis,int);
};

std::map<const char*,void(*)(a*)> m1;
std::map<const char*,int(*)(a*,int)> m2;

void func()
{
m1["1"]=a::f1;
m1["2"]=a::f2;
m1["3"]=a::f3;

m2["4"]=a::fi4;
m2["5"]=a::fi5;
}

void fff(a* p,const char* s)
{
     m1[s](p);
}

int fff(a* p,const char* s,int b)
{
     return m2[s](p,b);
}


Цитата
error LNK2019: ссылка на неразрешенный внешний символ "public: static int __cdecl a::fi5(class a *,int)" (?fi5@a@@SAHPAV1@H@Z) в функции "void __cdecl func(void)" (?func@@YAXXZ)
error LNK2019: ссылка на неразрешенный внешний символ "public: static int __cdecl a::fi4(class a *,int)" (?fi4@a@@SAHPAV1@H@Z) в функции "void __cdecl func(void)" (?func@@YAXXZ)
error LNK2019: ссылка на неразрешенный внешний символ "public: static void __cdecl a::f3(class a *)" (?f3@a@@SAXPAV1@@Z) в функции "void __cdecl func(void)" (?func@@YAXXZ)
error LNK2019: ссылка на неразрешенный внешний символ "public: static void __cdecl a::f2(class a *)" (?f2@a@@SAXPAV1@@Z) в функции "void __cdecl func(void)" (?func@@YAXXZ)
error LNK2019: ссылка на неразрешенный внешний символ "public: static void __cdecl a::f1(class a *)" (?f1@a@@SAXPAV1@@Z) в функции "void __cdecl func(void)" (?func@@YAXXZ)

Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 22-08-2009 17:07 » 

Mayor, а зачем тебе это в принципе понадобилось? Какой-то конечный автомат?
Подход по помещению методов в мап описан у Александреску в его "Modern C++ design", в разделе про фабрики иерархий объектов. Ну и про диспетчеризацию вызовов в целом у него много интересного есть.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 23-08-2009 06:00 » 

Mayor, а зачем тебе это в принципе понадобилось? Какой-то конечный автомат?
Подход по помещению методов в мап описан у Александреску в его "Modern C++ design", в разделе про фабрики иерархий объектов. Ну и про диспетчеризацию вызовов в целом у него много интересного есть.

неа для создания динамического интерфейса без перекомпиляции, идея какая:
щас я уже научился динамически создавать объект и заполнять его массив неизвестного размера однородными данными ( об истинной структуре объекта знает только сам объект, "текстовый файл с командами по созданию объектов и их данных" и модуль factory.cpp)

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

например есть интерфейс окна, который позволяет рисовать на чем угодно простые линии, есть интерфейс форм, который рисует через интерфейс окна фигуры состоящии из линий, есть основная логика программы которой пофигу на чем, что рисуется - она запросто берет из текстового файла через известные интерфейсы - что и на чем рисовать, и благодаря этому новые типы объектов ( правда фиксированые статическим интерфейсом ) создаются безо всекой перекомпиляции, как логики так и ранее созданых объектов


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

александреску "modern c++ design" наверное еще рановато читать, мне бы с наследванием, шаблонами и виртуальными функциями разобраться
Записан

1n c0de we trust
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 23-08-2009 08:53 » 

Не совсем понял, зачем нужен интерфейс, рисующий куда-то простые линии, если может потребоваться рисовать любые изображения вообще (включая, скажем, те же дуговые линии).

Как я себе понял твою задачу: есть окно (область на экране), в которое нужно рисовать нечто. Есть фигуры, которые программа может захотеть нарисовать (на окно? на форму?). Эти фигуры могут быть разной сложности и строиться из подгружаемых текстовых описаний.

Тогда, как мне кажется, всё решается на этапе строительства фигур: есть набор примитивов и есть строитель (паттерн Builder), который собирает по описанию из примитивов составные фигуры. Фигура (включая примитив) только и умеет, что отрисоваться в указанную область (то есть, имеет метод drawTo ) - при этом, внутри себя она может устанавливать цвета и всё такое прочее.
В этом случае, если требуется построить новую фигуру, потребуется просто убедиться, что имеются все необходимые примитивы и Builder сможет сконструировать эту фигуру из описания. И, если потребуется, добавить новый примитив.

В свете такого понимания задачи, динамические интерфейсы кажутся мне запутанным и ненадёжным решением.
« Последнее редактирование: 23-08-2009 08:55 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 23-08-2009 13:35 » 

Вад, а почему мой код выше не линкуется ? Вроде всё правильно
Записан

Mayor
Специалист

ru
Offline Offline

« Ответ #7 : 23-08-2009 13:52 » 

Не совсем понял, зачем нужен интерфейс, рисующий куда-то простые линии, если может потребоваться рисовать любые изображения вообще (включая, скажем, те же дуговые линии).

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

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

1n c0de we trust
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 23-08-2009 16:45 » 

Алексей1153++, а сами функции определены?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 23-08-2009 17:15 » 

Отлично всё, этот вопрос снят
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines