Изменить логику приложения во время выполнения - PullRequest
0 голосов
/ 07 декабря 2011

Мне было интересно, можно ли изменить логику приложения во время выполнения? Может, мы могли бы заменить реализацию абстрактного класса другой реализацией? Или, может быть, мы могли бы заменить общую библиотеку во время выполнения ...

обновление: Предположим, что у меня есть две реализации функции foo (x, y) и я могу использовать любую из них на основе strategy pattern. Теперь я хочу знать, возможно ли добавить третью реализацию foo (x, y) без перезапуска приложения.

Ответы [ 4 ]

4 голосов
/ 07 декабря 2011

Вы можете использовать плагин (библиотека, которую вы будете загружать во время выполнения), который предоставляет новую функцию foo. Я помню, что мы реализовали нечто подобное в школе, калькулятор, в который мы могли добавлять новые операции во время выполнения, без необходимости перезапуска программы. См. dlsym и dlopen .

Addenda

Будьте очень осторожны, когда dlclose указываете плагин, что он до сих пор не используется в каком-либо активном кадре стека вызовов. В Linux вы можете много тысяч раз вызывать dlopen (чтобы вы могли принимать не dlclose -ing плагины с некоторой утечкой адресного пространства).

2 голосов
/ 07 декабря 2011

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

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

0 голосов
/ 07 декабря 2011

Вот статья о самомодифицирующемся коде, которую я недавно прочитал: http://mainisusuallyafunction.blogspot.com/2011/11/self-modifying-code-for-debug-tracing.html

0 голосов
/ 07 декабря 2011

C ++ механизм виртуальных функций не позволяет изменять реализацию во время выполнения.

Однако вы можете реализовать любое изменение реализации во время выполнения с помощью указателей на функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...