<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489631</guid>
        <pubDate>Wed, 11 Jun 2014 04:13:23 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489631</link>
        <description><![CDATA[WhyNot: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3489438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-10T15:46:08+04:00">10.06.14, 11:46</time></span><div class='quote '>пс. У линковщика есть параметр кажется /OPT:NOREF который запрещает выкидывать не используемый код. </div></div><br>
Полезно.<br>
<br>
Правда, я уже выделил регистрации в отдельный файл.<br>
<br>
Всем спасибо.]]></description>
        <author>WhyNot</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489438</guid>
        <pubDate>Tue, 10 Jun 2014 11:46:08 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489438</link>
        <description><![CDATA[Urich: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3489135'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>WhyNot &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T15:08:30+00:00">09.06.14, 15:08</time></span><div class='quote '>А какие проблемы могут возникнуть со статическими переменными?</div></div><br>
Имелось ввиду возможность их двойной инициализации.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3489135'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>WhyNot &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T15:08:30+00:00">09.06.14, 15:08</time></span><div class='quote '>Что-то вроде *.cpp-файла, в котором перечисляются все функции которые регистрируются ,а потом функцию, которая их всех регистрирует; и потом вызывать эту функцию где-нибудь в main?</div></div><br>
Ну как то так. Делать регистрацию явно, когда уже приложение инициализировано.<br>
<br>
пс. У линковщика есть параметр кажется /OPT:NOREF который запрещает выкидывать не используемый код.]]></description>
        <author>Urich</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489135</guid>
        <pubDate>Mon, 09 Jun 2014 15:08:30 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489135</link>
        <description><![CDATA[WhyNot: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3488965'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T09:59:11+00:00">09.06.14, 09:59</time></span><div class='quote '>Код фабрики покажи.</div></div><br>
<br>
ActorFactory.h<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef ACTOR_FACTORY</div><div class="code_line">#define ACTOR_FACTORY</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;map&#62;</div><div class="code_line">#include &quot;../Core/World.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">/**</div><div class="code_line">&nbsp;* Factory that allows to create any type of registered actor by their name identifier.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Based on pattern Factory in book Andrei Alexandrescu &quot;Modern C++ Design: Generic Programming and Design Patterns Applied&quot;</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* ActorFactory is a singleton.</div><div class="code_line">&nbsp;*/</div><div class="code_line">class ActorFactory</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;typedef IActor* (*CreateActorCallback)(World *world, const Vector2D location, const Vector2D scale, const Rotator rotation);</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;typedef std::map&#60;std::string, CreateActorCallback&#62; CallbackMap;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @return the single instance of the ActorFactory</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;static ActorFactory&amp; Factory();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Register new actor class by an identifier and a &quot;create&quot; function.</div><div class="code_line">&nbsp;&nbsp; &nbsp; * If identifier already exists, factory will not be registered.</div><div class="code_line">&nbsp;&nbsp; &nbsp; *</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @return true if class wasn&#39;t registered earlier</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool registerActor(std::string actorId, CreateActorCallback createFn);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Unregister already registred class.</div><div class="code_line">&nbsp;&nbsp; &nbsp; *</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @return true if class was unregistered</div><div class="code_line">&nbsp;&nbsp; &nbsp; */ </div><div class="code_line">&nbsp;&nbsp; &nbsp;bool unregisterActor(std::string actorId);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Create actor by identifier.</div><div class="code_line">&nbsp;&nbsp; &nbsp; *</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @throws runtime_error when actorId is unknown</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;IActor* placeActor(std::string actorId, World *world, const Vector2D location, const Vector2D size, const Rotator rotation);</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;CallbackMap callbacks;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static ActorFactory* singleInstance;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Turn off unusable operations</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;ActorFactory();</div><div class="code_line">&nbsp;&nbsp; &nbsp;~ActorFactory();</div><div class="code_line">&nbsp;&nbsp; &nbsp;ActorFactory(const ActorFactory&amp;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;void operator=(const ActorFactory&amp;);</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
ActorFactory.cpp<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;ActorFactory.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">ActorFactory* ActorFactory::singleInstance = nullptr;</div><div class="code_line">&nbsp;</div><div class="code_line">ActorFactory::ActorFactory() {}</div><div class="code_line">ActorFactory::~ActorFactory() {}</div><div class="code_line">&nbsp;</div><div class="code_line">ActorFactory&amp; ActorFactory::Factory()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ActorFactory::singleInstance == nullptr)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ActorFactory::singleInstance = new ActorFactory();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return *ActorFactory::singleInstance;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool ActorFactory::registerActor(std::string actorId, CreateActorCallback createFn)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return this-&#62;callbacks.insert(CallbackMap::value_type(actorId, createFn)).second;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool ActorFactory::unregisterActor(std::string actorId)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return this-&#62;callbacks.erase(actorId) == 1;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">IActor* ActorFactory::placeActor(std::string actorId, World *world, const Vector2D location, const Vector2D scale, const Rotator rotation)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CallbackMap::const_iterator it = this-&#62;callbacks.find(actorId);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (it == this-&#62;callbacks.end())</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw std::runtime_error(&quot;Unknown actor identefier&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return (it-&#62;second)(world, location, scale, rotation);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3488965'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T09:59:11+00:00">09.06.14, 09:59</time></span><div class='quote '>А вообще такая регистрация плохая идея. Также как и статические переменные в либах.</div></div><br>
А какие проблемы могут возникнуть со статическими переменными?<br>
<br>
<br>
Как тогда лучше оформить регистрации в фабрике?<br>
Что-то вроде *.cpp-файла, в котором перечисляются все функции которые регистрируются ,а потом функцию, которая их всех регистрирует; и потом вызывать эту функцию где-нибудь в main?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3489009'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MyNameIsIgor &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T11:06:33+00:00">09.06.14, 11:06</time></span><div class='quote '>Что такое &quot;одно место линковки&quot;?</div></div><br>
Я думаю, имеется ввиду только один exe или dll, использующий библиотеку.]]></description>
        <author>WhyNot</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489009</guid>
        <pubDate>Mon, 09 Jun 2014 11:06:33 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489009</link>
        <description><![CDATA[MyNameIsIgor: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3489005'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T11:02:06+00:00">09.06.14, 11:02</time></span><div class='quote '>Пока у тебя в проекте одно место линковки</div></div><br>
Что такое &quot;одно место линковки&quot;?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3489005'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T11:02:06+00:00">09.06.14, 11:02</time></span><div class='quote '>пока не используешь менеджеры памяти отличные от рантаймоских</div></div><br>
Не вижу проблем.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3489005'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T11:02:06+00:00">09.06.14, 11:02</time></span><div class='quote '>Пока это только твой проект, у тебя все хорошо.</div></div><br>
Как раз IoC всегда помогало делать проект &quot;не только моим&quot;.]]></description>
        <author>MyNameIsIgor</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489005</guid>
        <pubDate>Mon, 09 Jun 2014 11:02:06 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3489005</link>
        <description><![CDATA[Urich: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3488976'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MyNameIsIgor &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T10:13:49+00:00">09.06.14, 10:13</time></span><div class='quote '>Идея хорошая, способствующая слабой связности. Но компоновщик её вечно портит.</div></div><br>
Я с этой хорошей идей намучился. Пока у тебя в проекте одно место линковки, пока не используешь менеджеры памяти отличные от рантаймоских. Пока это только твой проект, у тебя все хорошо.]]></description>
        <author>Urich</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3488976</guid>
        <pubDate>Mon, 09 Jun 2014 10:13:49 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3488976</link>
        <description><![CDATA[MyNameIsIgor: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3488965'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T09:59:11+00:00">09.06.14, 09:59</time></span><div class='quote '>Код фабрики покажи</div></div><br>
Код фабрики здесь не при чём. Компоновщик выбрасывает &quot;неиспользуемый&quot; код, вот и всё - проблема известная.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3488965'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T09:59:11+00:00">09.06.14, 09:59</time></span><div class='quote '>А вообще такая регистрация плохая идея.</div></div><br>
Идея хорошая, способствующая слабой связности. Но компоновщик её вечно портит. Меня тоже волнует вопрос топикстартера.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=390835&view=findpost&p=3488965'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Urich &#064; <time class="tag-quote__quoted-time" datetime="2014-06-09T09:59:11+00:00">09.06.14, 09:59</time></span><div class='quote '>Также как и статические переменные в либах.</div></div><br>
:blink: С чего бы?]]></description>
        <author>MyNameIsIgor</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3488965</guid>
        <pubDate>Mon, 09 Jun 2014 09:59:11 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3488965</link>
        <description><![CDATA[Urich: <strong class='tag-b'>WhyNot</strong><br>
Код фабрики покажи. А вообще такая регистрация плохая идея. Также как и статические переменные в либах.]]></description>
        <author>Urich</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3488720</guid>
        <pubDate>Sun, 08 Jun 2014 07:37:47 +0000</pubDate>
        <title>Нелокальные статические объекты и статические библиотеки</title>
        <link>https://forum.sources.ru/index.php?showtopic=390835&amp;view=findpost&amp;p=3488720</link>
        <description><![CDATA[WhyNot: Компилятор: идущий по стандарту с VS2012<br>
ОС: Windows<br>
<br>
<br>
Нашёл для себя интересную особенность, связанную с компоновщиком.<br>
Если в статической библиотеке есть объектные файлы на которые нет ссылок, то эти объектные файлы не компонуются с программой.<br>
Соответственно, не инициализируются любые статические объекты в этом файле.<br>
<br>
С одной стороны, всё логично.<br>
<br>
Но вот например, у меня есть код регистрирующий конструкторы классов в фабрике:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;Engine/Modules/ActorFactory.h&#62;</div><div class="code_line">// unnamed namespase to hide from another places</div><div class="code_line">namespace</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// specific factory</div><div class="code_line">&nbsp;&nbsp; &nbsp;IActor* CreateWall(World *world, const Vector2D location, const Vector2D scale, const Rotator rotation)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return new Wall(world, location, scale, rotation);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const std::string CLASS_ID = &quot;Wall&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// register specific factory in actor factory</div><div class="code_line">&nbsp;&nbsp; &nbsp;const bool registered = ActorFactory::Factory().registerActor(CLASS_ID, CreateWall);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Такой вот код включён в исходные коды разных объектов, дабы можно было изменять/удалять регистрации классов вместе с самими объектами.<br>
<br>
И всё было хорошо, но после вынесения всех таких классов в статическую библиотеку, часть из них перестала регистрироваться в фабрике.<br>
<br>
Однако, если, например, создавать хотя бы один объект класса Wall вручную, то объектный файл подключается, происходит регистрация, и остальные объекты этого класса нормально создаются.<br>
<br>
Пока не вижу хорошего решения этой проблемы:<ul class="tag-list"><li>Если вынести регистрации классов в основную программу, то это внесёт сложности при добавлении/удалении/модификации этих классов</li><li>Если вручную ссылаться на что-нибудь в этих единицах трансляции, то это будет очень неявно и когда-нибудь всё опять сломается</li></ul><br>
<br>
Что можете посоветовать в данной ситуации?]]></description>
        <author>WhyNot</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	