{"id":242,"date":"2009-04-13T19:24:16","date_gmt":"2009-04-13T17:24:16","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=242"},"modified":"2009-04-14T12:48:23","modified_gmt":"2009-04-14T10:48:23","slug":"242","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/","title":{"rendered":"Defining One Entry Point to Write a Variable"},"content":{"rendered":"<p>I&#8217;ve found myself in situations when I spent lots of time debugging because of some variables declared in a base class were written in tens or maybe hundreds of places in the whole hierarchy, across one or multiple projects even. How could you find the right place where the value of such a variable changes? Well, not easy unless you make some changes to the code. In this article I&#8217;m going to show how to create a small wrapper to help you there.<\/p>\n<p>But first, some rules of thumb:<\/p>\n<ul>\n<li>Don&#8217;t make your variables public. This is pretty basic, but I&#8217;ve seen experienced people ignoring it; breaking it is a certain cause for maintenance problems.<\/li>\n<li>When you have member variables in a base class that can potentially be assigned in many places across the hierarchy make it private, not protected, and provide Get\/Set accessors to read and write it. Moreover, prefer to use this accessors in the base class too, instead of accessing it directly. This way you get only one entry point for reading\/writing it, so spotting the places where the value changes will be trivial.<\/li>\n<\/ul>\n<p>If you decide to go with the second rule that I mentioned I can bet you might be tempted to avoid the last advice and write it directly in the base class. Or if you won&#8217;t, one of your teammates will. To enforce that, you can use a wrapper class like the one show below.<\/p>\n<pre class=\"prettyprint\">\r\ntemplate &lt; typename T &gt;\r\nclass ExplicitWriteVariable\r\n{\r\n\tT value_;\r\n\r\n\t\/\/ do not allow assigning values\r\n\tT&amp; operator=(const T&amp; val);\r\n\r\npublic:\r\n\tExplicitWriteVariable()\r\n\t{\r\n\t}\r\n\r\n\texplicit ExplicitWriteVariable(const T&amp; val): value_(val)\r\n\t{\r\n\t}\r\n\r\n\tbool operator==(const ExplicitWriteVariable&lt; T &gt;&amp; rhv)\r\n\t{\r\n\t\treturn value_ == rhv.value_;\r\n\t}\r\n\r\n\tbool operator!=(const ExplicitWriteVariable&lt; T &gt;&amp; rhv)\r\n\t{\r\n\t\treturn value_ != rhv.value_;\r\n\t}\r\n\r\n\tbool operator==(const T&amp; rhv)\r\n\t{\r\n\t\treturn value_ == rhv;\r\n\t}\r\n\r\n\tbool operator!=(const T&amp; rhv)\r\n\t{\r\n\t\treturn value_ != rhv;\r\n\t}\r\n\r\n\t\/\/ allow assignment of the wrapper objects, and use Set for modifying the wrapper value\r\n\tExplicitWriteVariable&lt; T &gt;&amp; operator=(const ExplicitWriteVariable&lt; T &gt;&amp; rhv)\r\n\t{\r\n\t\tif(this != &amp;rhv)\r\n\t\t{\r\n\t\t\tSet(rhv.value_);\r\n\t\t}\r\n\t\treturn *this;\r\n\t}\r\n\r\n\t\/\/ operator T is used for getting the wrapped value\r\n\toperator T () const\r\n\t{\r\n\t\treturn value_;\r\n\t}\r\n\r\n\t\/\/ this is the only entry point for setting the value of the variable\r\n\tvoid Set(const T&amp; val)\r\n\t{\r\n\t\tvalue_ = val;\r\n\t}\r\n};\r\n\r\n<\/pre>\n<p>This template class has the following characteristics:<\/p>\n<ul>\n<li>provides a default constructor and an explicit constructor<\/li>\n<li>the assignment operator is made private and not implemented, which means you cannot use an object of this type on the left side of an assignment<\/li>\n<li>provides the operator T() which allows to read the value without needing an explicit Get accessor<\/li>\n<li>provides a Set accessor for changing the wrapper value; this is the only possible entry point for writing<\/li>\n<li>has some comparison operators<\/li>\n<\/ul>\n<p>If you use this to wrap variables in a base class you don&#8217;t make it private, but protected in the base class, otherwise you&#8217;ll have to provide get\/set accessors for the ExplicitWriteVariable object itself. The lacking of operator= will force you though to use the Set() method explicitly.<\/p>\n<p>Here are some samples for using the class:<\/p>\n<pre class=\"prettyprint\">\r\nvoid Print(int val)\r\n{\r\n\tstd::cout << val << std::endl;\r\n}\r\n\r\nint main()\r\n{\r\n\tExplicitWriteVariable&lt; int &gt; val(10);\r\n\r\n\tPrint(val);\r\n\tif(val % 10 == 0) std::cout << \"multiple of 10\" << std::endl;\r\n\r\n\tval.Set(43);\r\n\r\n\tPrint(val);\r\n\tif(val % 2 == 1) std::cout << \"odd number\" << std::endl;\r\n\r\n\treturn 0;\r\n}<\/pre>\n<pre class=\"prettyprint\">\r\n10\r\nmultiple of 10\r\n43\r\nodd number\r\n<\/pre>\n<p>The following produces an error:<\/p>\n<pre class=\"prettyprint\">\r\nExplicitWriteVariable&lt; int &gt; val(10);\r\nval = 43; \/\/ error C2248\r\n<\/pre>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve found myself in situations when I spent lots of time debugging because of some variables declared in a base class were written in tens or maybe hundreds of places in the whole hierarchy, across one or multiple projects even. How could you find the right place where the value of such a variable changes? &#8230; <a title=\"Defining One Entry Point to Write a Variable\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/\" aria-label=\"Read more about Defining One Entry Point to Write a Variable\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7],"tags":[104,451,105,106],"class_list":["post-242","post","type-post","status-publish","format-standard","hentry","category-c","tag-accessors","tag-c","tag-template","tag-wrapper"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"accessors,c++,template,wrapper\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Defining One Entry Point to Write a Variable\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2009-04-13T17:24:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2009-04-14T10:48:23+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Defining One Entry Point to Write a Variable\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#article\",\"name\":\"Defining One Entry Point to Write a Variable\",\"headline\":\"Defining One Entry Point to Write a Variable\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2009-04-13T19:24:16+02:00\",\"dateModified\":\"2009-04-14T12:48:23+02:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#webpage\"},\"articleSection\":\"C++, accessors, C++, template, wrapper\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#listItem\",\"name\":\"Defining One Entry Point to Write a Variable\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#listItem\",\"position\":5,\"name\":\"Defining One Entry Point to Write a Variable\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/\",\"name\":\"Defining One Entry Point to Write a Variable\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/04\\\/13\\\/242\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2009-04-13T19:24:16+02:00\",\"dateModified\":\"2009-04-14T12:48:23+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Defining One Entry Point to Write a Variable","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/","robots":"max-image-preview:large","keywords":"accessors,c++,template,wrapper","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#article","name":"Defining One Entry Point to Write a Variable","headline":"Defining One Entry Point to Write a Variable","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2009-04-13T19:24:16+02:00","dateModified":"2009-04-14T12:48:23+02:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#webpage"},"articleSection":"C++, accessors, C++, template, wrapper"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#listItem","name":"Defining One Entry Point to Write a Variable"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#listItem","position":5,"name":"Defining One Entry Point to Write a Variable","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/","name":"Defining One Entry Point to Write a Variable","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2009-04-13T19:24:16+02:00","dateModified":"2009-04-14T12:48:23+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"Defining One Entry Point to Write a Variable","og:url":"https:\/\/mariusbancila.ro\/blog\/2009\/04\/13\/242\/","article:published_time":"2009-04-13T17:24:16+00:00","article:modified_time":"2009-04-14T10:48:23+00:00","twitter:card":"summary","twitter:title":"Defining One Entry Point to Write a Variable"},"aioseo_meta_data":{"post_id":"242","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:16:02","updated":"2025-12-12 07:25:17","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"I&#8217;ve found myself in situations when I spent lots of time debugging because of some variables declared in a base class were written in tens or maybe hundreds of places in the whole hierarchy, across one or multiple projects even. How could you find the right place where the value of such a variable changes?&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">accessors<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">template<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">wrapper<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">accessors<\/span>","<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">template<\/span>","<span class=\"advgb-post-tax-term\">wrapper<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 17 years ago","modified":"Updated 17 years ago"},"absolute_dates":{"created":"Posted on April 13, 2009","modified":"Updated on April 14, 2009"},"absolute_dates_time":{"created":"Posted on April 13, 2009 7:24 pm","modified":"Updated on April 14, 2009 12:48 pm"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/sYNdv-242","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=242"}],"version-history":[{"count":11,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/242\/revisions"}],"predecessor-version":[{"id":253,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/242\/revisions\/253"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}