{"id":75,"date":"2009-02-28T02:19:20","date_gmt":"2009-02-28T01:19:20","guid":{"rendered":"http:\/\/netrix.org.pl\/index.php\/2009\/02\/28\/refactor-silnika-zarzadzajace-uchwyty\/"},"modified":"2011-02-12T02:26:53","modified_gmt":"2011-02-12T01:26:53","slug":"refactor-silnika-zarzadzajace-uchwyty","status":"publish","type":"post","link":"https:\/\/netrix.org.pl\/index.php\/2009\/02\/28\/refactor-silnika-zarzadzajace-uchwyty\/","title":{"rendered":"Refactor silnika + automatyczne uchwyty"},"content":{"rendered":"<p>W\u0142a\u015bnie mija tydzie\u0144 od zako\u0144czenia dwutygodniowego pobytu w domu w czasie ko\u0144c\u00f3wki sesji i przerwy egzaminacyjnej. W tym czasie rozpocz\u0105\u0142em przepisywania mojego &#8220;silnika&#8221; od nowa, tym razem w oparciu o interfejsy. S\u0105 one bardzo por\u0119czne, gdy chce si\u0119 ukry\u0107 implementacj\u0119 klas wewn\u0105trz statycznych, b\u0105d\u017a dynamicznych bibliotek. G\u0142\u00f3wnym za\u0142o\u017ceniem przy projektowaniu drugiej wersji NIne by\u0142o w\u0142a\u015bnie ukrycie implementacji wewn\u0105trz statycznej biblioteki .lib. Dzi\u0119ki takiemu post\u0119powaniu biblioteka wygl\u0105da \u0142adnie i pozwala \u0142adnie rozszerza\u0107 w\u0142asn\u0105 funkcjonalno\u015b\u0107.<\/p>\n<p>Drugim zagadnieniem poruszanym w tej notce s\u0105 uchwyty, kt\u00f3re same zarz\u0105dzaj\u0105 licznikiem danego zasobu.<br \/>\nZ pocz\u0105tku implementacj\u0119 uchwyt\u00f3w opiera\u0142em na artykule znajduj\u0105cym si\u0119 w ksi\u0105\u017cce &#8220;Game Programming Gems&#8221;, jednak problemem okaza\u0142o si\u0119 zmuszenie tych\u017ce uchwyt\u00f3w do sprz\u0105tania po sobie zasob\u00f3w. Na szcz\u0119\u015bcie rozwi\u0105zanie okaza\u0142o si\u0119 proste, poniewa\u017c wystarczy\u0142o umie\u015bci\u0107 w klasie uchwytu wska\u017anik do menad\u017cera zasob\u00f3w.<\/p>\n<p>Poni\u017cej znajduje si\u0119 moja implementacja takiego uchwytu:<\/p>\n<pre lang=\"cpp\">\r\ntemplate< typename TAG>\r\nclass AutomaticHandle\r\n{\r\npublic:\r\n\t\/\/ Podstawowy konstruktor\r\n\tAutomaticHandle(Dword handle, MHandleMgr* manager) : m_handle(handle), m_manager(manager)\r\n\t{}\r\n\t\/\/ Konstruktor kopiuj\u0105cy\r\n\tAutomaticHandle(const AutomaticHandle& src) : m_manager(src.m_manager), m_handle(src.m_handle)\r\n\t{ m_manager->Copy(src.m_handle); }\r\n\t\/\/ Destruktor\r\n\t~AutomaticHandle()\r\n\t{ m_manager->Release(m_handle); }\r\n\t\/\/ Operator przypisania\r\n\tconst AutomaticHandle& operator =(const ManagedHandle& src)\r\n\t{ m_manager->Release(m_handle);\r\n\t  m_handle = src.m_handle;\r\n\t  m_manager->Copy(src.m_handle);\r\n\t  return src; }\r\n\t\/\/ Operator Dword\r\n\toperator Dword() const\r\n\t{ return m_handle; }\r\n\t\/*\r\n\t...\r\n\t*\/\r\n\r\nprivate:\r\n\t\/\/ Uchwyt\r\n\tDword m_handle;\r\n\t\/\/ Wska\u017anik do managera\r\n\tMHandleMgr* m_manager;\r\n};\r\n<\/pre>\n<p>Jak wida\u0107 klasa zawiera dodatkow\u0105 zmienn\u0105 &#8211; wska\u017anik na klas\u0119 menad\u017cera ustawiany przy konstrukcji. Klasa menad\u017cera musi zawiera\u0107 u\u017cywane metody, kt\u00f3re wewn\u0105trz zarz\u0105dzaj\u0105 licznikiem odwo\u0142a\u0144 na dany zas\u00f3b, a w momencie jego spadku do 0, likwidowa\u0107 dany zas\u00f3b.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W\u0142a\u015bnie mija tydzie\u0144 od zako\u0144czenia dwutygodniowego pobytu w domu w czasie ko\u0144c\u00f3wki sesji i przerwy egzaminacyjnej. W tym czasie rozpocz\u0105\u0142em przepisywania mojego &#8220;silnika&#8221; od nowa, tym razem w oparciu o interfejsy. S\u0105 one bardzo por\u0119czne, gdy chce si\u0119 ukry\u0107 implementacj\u0119 klas wewn\u0105trz statycznych, b\u0105d\u017a dynamicznych bibliotek. G\u0142\u00f3wnym za\u0142o\u017ceniem przy projektowaniu drugiej wersji NIne by\u0142o w\u0142a\u015bnie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[88,179,20],"_links":{"self":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/75"}],"collection":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/comments?post=75"}],"version-history":[{"count":5,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/75\/revisions"}],"predecessor-version":[{"id":800,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/75\/revisions\/800"}],"wp:attachment":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/media?parent=75"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/categories?post=75"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/tags?post=75"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}