![]() |
таблица пойнтеров на методы разных классов
Вопрос к гуру С++ :
Имеется в наличии Код:
void C1::m1(int ); нужно сделать такой выкрутас чтобы а) хранить таблицу пойнтеров на методы (заметьте разных классов - кастинг в пойнтер войд не предлагать) б) в зависимисти от инпута вызывать соответсвующий метод по пойнтеру: т.е если инпут 1 - вызывать по пойнтеру на C1::m1(), а если 3 - вызывать C2::m3() Сегодня у меня есть уже класс для вызова методов но только для одного класса, и я вызываюнужный метод по Код:
(m_pBaseClass->*pMethod)(nIntValue) Заранее спасибо. |
Я конечно не гуру С++, но если у тебя куча классов с одинаковыми методами, это похоже на стандартный фабричный шаблон.
http://www.google.ee/search?hl=et&cl...&btnG=Otsi&lr= |
похоже на правду. А примерчик накидать можно? как сделать
Код:
C3 executor; P.S. я не программер, и пример жизненно необходим. Если C1 и C2 наследники С0 - это что-то меняет? |
Предложение: не надо хранить указатели на функции. Храни функторы (functor). Т.к. это нормальные объекты то делаешь наследование и всё ок.
Вот объяснение: http://en.wikipedia.org/wiki/Function_object |
Повторю еще раз Я -НЕ ПРОГРАММИСТ. Мне нужно сделать так, чтобы я мог запускать методы разных классов не зная их имени и порядок во время компиляции.
Фраза Цитата:
Код:
|
примерно так выглядят фанкторы:
Код:
class Functor { надеюсь стало понятнее |
Код:
class C1; |
к сожалению, прототип Call должен быть одинаков во всех классах. Поэтому может так:
Код:
class C1; |
чего-то слишком сложно получается... Я ведь с самого начала хотел избежать выраженного вызова m_c1.Do() Если несколько методов у каждого класса C1, C2, то как я с ними расправлюсь?
... или я чего не понимаю ? пока додумался использовать темплейты, но как сделать для 2 классов одновременно - не понимаю Код:
template <typename BaseClass> |
Я наверное сам ничего не понимаю, запутался. У тебя есть:
class B; class D1 : public B; class D2 : public B; почему бы не определить методы m... виртуальными и держа указатель на B просто вызывать их? |
Для начала неплохо было бы понять ради чего конкретно городить огород, вообще? А уж потом решать как это организовывать. Не совсем понятная постановка задачи.
Я так понял что имеется мношество каких-то алгоритмов, которые прменяются к инту в зависимости от контекста, тогда возможно что следует просто завести множество унифицированных классов алгоритмов и сделать для них общий автоматический азпускальшик по контексту? |
Для чего это нужно - я написал простенький интерпретатор, заточенный под мои нужды. У меня есть несколько алгоритмов которые применяются к интерфейс-классу параметров (в примере заменено на int). Алгоритмы запускаются один за другим в какой-то последовательности, заданной в файле конфигурации. Я читаю файл конфигурации и запускаю алгоритмы в том порядке, как в нем указано.
У меня есть несколько уже существующих классов для разных семейств алгоритмов. Пока я работаю с каким-то одним классом -все нормально, тот код что я привел в посте #9 меня полностью устраивает: там есть инстанс (я имею в виду инициализированный об'ект - пользуююсь своим жаргоном) класса, и я запускаю его методы как мне и нужно. Но если мне надо работать с 2 классами одновременно - то мне нужно какое-то образование, чтобы держало инстансы всех нужных мне классов, и вызывало их методы в зависимости от входных данных. Надо учесть что классы алгоритмов уже написаны и их сильно менять не желательно -сегодня я просто добавил "обертку" на существующие методы, чтобы унифицировать интерфейс. Цитата:
как бы я хотел, чтобы это выглядело в коде : Код:
class CAlg1; // has methods m11(), m12(), m13() |
Так и думал что это интерпретатор. :-)
Доберусь домой, попробую накропать маленький приерчик. |
Цитата:
Тут я нашёл простой пример фабрики с коментами. Гугл рулит. :) |
EvroStandart, Спасибо, но сюда фабрика не подходит. Фабрика дает выбрать какой именно об'ект инициализировать. В моем случае я должен держать инстансы обеих классов, и вызывать подходящий метод из какого-то одного. Хотя на той же странице я нашел "Chain of Responsibility Design Pattern" - это судя по всему то что мне нужно. Сча буду разбираться.
|
Естественно это не скомпилируется сразу - это только первые наметки, еслои так можно сказать. Суть данного метода в том что можно сделать как раз обертку на уже готовый функционал. С помощью шаблонов все это можно расширить таким образом чтобы при наследовании от уже написанного ранее класса алгоритма (не по данной схеме) его конструктор вызывался автоматом, после чего можно получить более красивые вещи, например, для регистрации алгоритмов использовать более хитрые шаблоны, более корректно проверяющие что им подают в качестве параметров шаблона...
Еще раз повторяю что все что приведено ниже это просто наметки и намеки, на то как можно сделать. Код:
class ArgumentsList |
посмотри boost::function
конкретно вот это: http://boost.org/doc/html/function/t...html#id2688553 PS сильно не вникал в суть дискуссии, так что может быть мимо :rolleyes: |
PSyton, попытался расширить с помощь шаблонов - умудрился вышибить компайлер с ексепшеном :eek: послезавтра продолжу эксперимент - сделаю без расширения :)
Flexz, не это то что надо. Я тоже наткнулся на несколько решений - но чтобы их исползовать надо понять как - а весь boost написан так, что мне проще написать самому, чем разобраться как его пользовать. -------------------------------- Сделал. В интерпретаторе хранятся пойнтеры на базисный класс, темплейтом сделал регистрацию с разным количеством входных переменных, и промежуточный класс тоже темплейтный. Вызывается виртуальные метод "Call" базисного класса, и из-за инициации наследников подходящими методами все работает. Таким образом вызов выглядит так: Код:
C1 c1; |
Часовой пояс GMT +4, время: 22:18. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.