{"id":1847,"date":"2016-08-22T11:27:26","date_gmt":"2016-08-22T16:27:26","guid":{"rendered":"http:\/\/www.logikalsolutions.com\/wordpress\/?p=1847"},"modified":"2024-09-17T07:25:38","modified_gmt":"2024-09-17T12:25:38","slug":"c-11-and-qt-part-3-this-is-broken","status":"publish","type":"post","link":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/","title":{"rendered":"C++ 11 and Qt \u2014 Part 3 This is Broken"},"content":{"rendered":"<p style=\"text-align: justify;\">One of the many reasons medical devices and all systems where adverse outcome for humans are slow to adopt &#8220;new&#8221; things is that there is so little known about &#8220;the wrong way.&#8221; You will find many snippets and books on-line professing to show you &#8220;the write way&#8221; but so few show you the wrong way and explain why it is the wrong way. Most of the token few wrong way post and book examples you will find tend to lean pretty heavy on style and seemingly random coding standards.<\/p>\n<p style=\"text-align: justify;\">For a number of years people have been pushing <a href=\"http:\/\/www.learncpp.com\/cpp-tutorial\/8-5a-constructor-member-initializer-lists\/\">constructor initializer lists<\/a> on C++ developers. I have heard many claims about them being &#8220;more efficient&#8221; but I&#8217;ve never seen hard evidence of that. It is very difficult to prove something is _always_ more efficient across a wide range of compilers and platforms. This is especially true on embedded targets where dynamic memory allocation is traditionally a slow and expensive process. To some extent I have adopted using the initializer list while coding, but, I probably shouldn&#8217;t have. From a readability standpoint it is much easier to determine initialization values if they are all in a list.<\/p>\n<pre style=\"text-align: justify;\">MyClass::MyClass( Widget *widget) :\r\n\u00a0 m_widget(widget),\r\n\u00a0 m_ratio( 3.75),\r\n\u00a0 m_width( 500),\r\n\u00a0 m_length( 500)\r\n{\r\n\u00a0...\r\n}<\/pre>\n<p style=\"text-align: justify;\">Given a constructor for a complex object which could be hundreds or thousands of lines long, especially in an embedded world where the object may well be controlling a physical device which has an initialization protocol, it is certainly easier to see what the values were set to if they are all at the top. In many ways this is feature is homage to the COBOL WORKING-STORAGE SECTION.<\/p>\n<pre style=\"text-align: justify;\">WORKING-STORAGE SECTION. \r\n\u00a0\u00a0\u00a0 01 CONSTANTS. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 KEY_PAD_MODE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC 9 COMP\u00a0\u00a0 VALUE 1. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 SIGNAL_BELL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC 9 COMP\u00a0\u00a0 VALUE ZERO. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 TCA_SIZE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC 99 COMP\u00a0 VALUE 12. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 TCA_UNIT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC 99 COMP\u00a0 VALUE 2. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 WORKSPACE_SIZE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC S9(9) COMP VALUE 2000. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 LOGICAL_UNIT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC 9 COMP VALUE 1. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 START-LINE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC 9 COMP VALUE 1. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 SCREEN-LINE-COUNT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC 99 COMP VALUE 23. \r\n\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 01 STATUS-VARIABLES. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 05 DONE-FLAG\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PIC X. \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 88 WE-ARE-DONE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 VALUE 'Y'.<\/pre>\n<p style=\"text-align: justify;\">Before we started writing callable COBOL modules with LINKAGE SECTION parameters, we as programmers used to religiously assign every declared variable an initial value in this section. Once we started having re-entrant\/callable modules, the practice changed to initializing everything in the initial code. Why? Because WORKING-STORAGE was only initialized on the first call. After that you had whatever you left there.<\/p>\n<p style=\"text-align: justify;\">The initializer list is also misleading. Just because a member variable was initialized to a value in the list doesn&#8217;t mean the constructor didn&#8217;t change that value due to some requirement. Bad coding you say? Not in the least. In fact it is really common in the embedded and semi-embedded worlds. Devices have physical limitations. You are required to log any errors AND you are required to provide patient safety above all else.<\/p>\n<p style=\"text-align: justify;\">What if your constructor is for a serial port? What if you defaulted to 115200 baud because all of the new devices contain high end serial ports? What if this code is loaded onto an older device where 9600 is the maximum hardware supported baud rate? What do you do? Do you throw an exception and hope something catches it? Not cool. Given most medical devices must be multi-lingual adding _any_ text error message is a painful process. The patient-safety-first approach is to log the error to the system log file so it is recorded for support, then fall back to 9600 inside of the constructor. The device isn&#8217;t broken, it is just communicating slower than the newer devices.<\/p>\n<p style=\"text-align: justify;\">Constructors for objects which control physical devices will _always_ have need to change the values. Don&#8217;t like the serial port example? How about a system cooling fan with integrated\/remote\u00a0 thermometer? Your default value is an idle speed, say 300 RPM. Fan gets started because fan must _always_\u00a0 be started before checking temp. Temperature is checked and found to be just below egg frying so fan gets set to maximum speed.<\/p>\n<p style=\"text-align: justify;\">Think that is too much for a constructor? Perhaps. At least until you look at the system requirement stating all devices must be initialized to a known &#8220;safe&#8221; state. A device which is about to overheat and fail is not safe.<\/p>\n<p style=\"text-align: justify;\">Using initializer lists with C++ constructors is a wee bit dangerous under C++ 11 standard. All initial values should be declared in the class definition. Any overrides should be done as assignments inside of the constructor. Why? Here is some horribly written broken code to show you just how wrong things can go.<\/p>\n<pre style=\"text-align: justify;\">\/\/ test2class.h\r\n\/\/ \r\n#include &lt;string&gt;\r\n\r\nclass Test2Class\r\n{\r\nprivate:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int m_kount = 10;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double m_ratio = 3.45;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::string m_msg{ \"default message\"};\r\n\r\npublic:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 explicit Test2Class( int kount, double ratio, const std::string&amp; msg ) :\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_kount(kount),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_ratio(ratio),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_msg(msg) {}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 explicit Test2Class( const std::string&amp; msg)\u00a0 { Test2Class( m_kount, m_ratio, msg); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 explicit Test2Class( double ratio) { Test2Class( m_kount, ratio, m_msg); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 explicit Test2Class( int kount)\u00a0\u00a0\u00a0 { Test2Class( kount, m_ratio, m_msg); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 explicit Test2Class()\u00a0 { }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::string dumpValues();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n};<\/pre>\n<p style=\"text-align: justify;\">Assume you are a student new to C++. You see the language allows you to assign initial values in the class definition and you want to write something which both assigns default values while having constructors that allow a single value to be overridden. The above code, while not good, may seem like a reasonable option.<\/p>\n<pre style=\"text-align: justify;\">#include \"test2class.h\"\r\n#include &lt;sstream&gt;\r\n#include &lt;iostream&gt;\r\n\r\nstd::string Test2Class::dumpValues()\r\n{\r\n\u00a0\u00a0\u00a0 std::string txt;\r\n\u00a0\u00a0\u00a0 std::stringstream txtStream( txt);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 txtStream &lt;&lt; \"Kount: \" &lt;&lt; m_kount \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&lt; \" Ratio: \" &lt;&lt; m_ratio\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&lt; \" Msg: \" &lt;&lt; m_msg;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"txtStream before return: \";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; txtStream.str() &lt;&lt; std::endl;\r\n\u00a0\u00a0\u00a0 return txtStream.str();\r\n}<\/pre>\n<p style=\"text-align: justify;\">The main module is not much different from our previous example.<\/p>\n<pre style=\"text-align: justify;\">#include \"test2class.h\"\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Test2Class a;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Test2Class b( 16);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Test2Class c( 3.1435);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Test2Class d( std::string{\"new message\"});\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Test2Class d( \"new message\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Values for a: \" &lt;&lt; a.dumpValues() &lt;&lt; std::endl;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Values for b: \" &lt;&lt; b.dumpValues() &lt;&lt; std::endl;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Values for c: \" &lt;&lt; c.dumpValues() &lt;&lt; std::endl;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Values for d: \" &lt;&lt; d.dumpValues() &lt;&lt; std::endl;\r\n}<\/pre>\n<p style=\"text-align: justify;\">Good luck debugging this!<\/p>\n<pre style=\"text-align: justify;\">roland@roland-HP-Compaq-8100-Elite-SFF-PC:~\/fopa$ g++ -Wall -g -std=c++11 test2.cpp test2class.cpp -o test2\r\nroland@roland-HP-Compaq-8100-Elite-SFF-PC:~\/fopa$ .\/test2txtStream before return: Kount: 10 Ratio: 3.45 Msg: default message\r\nValues for a: Kount: 10 Ratio: 3.45 Msg: default message\r\ntxtStream before return: Kount: 10 Ratio: 3.45 Msg: default message\r\nValues for b: Kount: 10 Ratio: 3.45 Msg: default message\r\ntxtStream before return: Kount: 10 Ratio: 3.45 Msg: default message\r\nValues for c: Kount: 10 Ratio: 3.45 Msg: default message\r\ntxtStream before return: Kount: 10 Ratio: 3.45 Msg: default message\r\nValues for d: Kount: 10 Ratio: 3.45 Msg: default message<\/pre>\n<p style=\"text-align: justify;\">I was completely flabbergasted this compiled. I thought for certain the compiler would gag on passing member variables to a delegated constructor. Part of the problem can be laid at the door of <a href=\"http:\/\/www.stroustrup.com\/C++11FAQ.html#member-init\">Mr. Strousup&#8217;s explanation<\/a>.<\/p>\n<blockquote>\n<p style=\"text-align: justify;\">If a member is initialized by both an in-class initializer and a constructor, only the constructor&#8217;s initialization is done (it &#8220;overrides&#8221; the default).<\/p>\n<p style=\"text-align: justify;\">\n<pre><b>\r\n\tclass A {\r\n\tpublic:\r\n\t\tint a = 7;\r\n\t};\r\n<\/b><\/pre>\n<p style=\"text-align: justify;\">This is equivalent to:<\/p>\n<pre><b>\r\n\tclass A {\r\n\tpublic:\r\n\t\tint a;\r\n\t\tA() : a(7) {}\r\n\t};\r\n<\/b><\/pre>\n<\/blockquote>\n<p style=\"text-align: justify;\">The statement I&#8217;ve quoted is meant to protect a developer from the unmentioned damage assigning values within the class definition can do given the &#8220;equivalent to&#8221; example. The compiler is generating\/modifying constructor initializer lists behind the scenes. Your only method of debugging will be stepping through the assembly code (you did take assembler in college, right?)<\/p>\n<p style=\"text-align: justify;\">In theory, the initial quoted statement requires compiler developers to test for collision before jambing in the hidden initializers. I suspect some compilers simply generate their list and put it in front of any list which happens to be on the constructor assuming &#8220;last one in wins.&#8221; If the class members aren&#8217;t objects controlling physical devices which cannot be shared you &#8220;could&#8221; get away with this. What if the device being allocated is something like cancer treating radiation device and the initialization releases some default amount into the patient, followed by the amount the doctor actually ordered?<\/p>\n<p style=\"text-align: justify;\">Changing the code of our previous example does appear to work using the initializer list.<\/p>\n<pre style=\"text-align: justify;\">#ifndef TEST3CLASS_H\r\n#define TEST3CLASS_H\r\n\r\n#include &lt;string&gt;\r\n\r\nclass Test3Class\r\n{\r\npublic:\r\n\u00a0\u00a0\u00a0 ~Test3Class();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 explicit Test3Class();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 explicit Test3Class( const std::string&amp; msg); \r\n\u00a0\u00a0\u00a0 explicit Test3Class( double ratio);\r\n\u00a0\u00a0\u00a0 explicit Test3Class( int kount);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 std::string dumpValues();\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int m_kount=10;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double m_ratio=3.45;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::string m_msg{\"default message\"};\r\n};\r\n\r\n\r\n#endif \/\/ TEST3CLASS_H<\/pre>\n<pre style=\"text-align: justify;\">#include \"Test3Class.h\"\r\n#include &lt;iostream&gt;\r\n#include &lt;sstream&gt;\r\n\r\nTest3Class::Test3Class( int kount) :\r\n\u00a0 m_kount(kount)\r\n{\r\n\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Constructor (int): kount: \" &lt;&lt; m_kount &lt;&lt; \" ratio: \" &lt;&lt; m_ratio &lt;&lt; \" msg: \" &lt;&lt; m_msg &lt;&lt; std::endl;\r\n}\r\n\r\nTest3Class::Test3Class( double ratio) :\r\n\u00a0 m_ratio(ratio)\r\n{\r\n\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Constructor (double): kount: \" &lt;&lt; m_kount &lt;&lt; \" ratio: \" &lt;&lt; m_ratio &lt;&lt; \" msg: \" &lt;&lt; m_msg &lt;&lt; std::endl;\r\n}\r\n\r\nTest3Class::Test3Class( const std::string&amp; msg) :\r\n\u00a0 m_msg(msg)\r\n{\r\n\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Constructor (std::string): kount: \" &lt;&lt; m_kount &lt;&lt; \" ratio: \" &lt;&lt; m_ratio &lt;&lt; \" msg: \" &lt;&lt; m_msg &lt;&lt; std::endl;\r\n}\r\n\r\nTest3Class::~Test3Class()\r\n{\r\n}\r\n\r\n\r\nstd::string Test3Class::dumpValues()\r\n{\r\n\u00a0\u00a0\u00a0 std::string txt;\r\n\u00a0\u00a0\u00a0 std::stringstream txtStream( txt);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 txtStream &lt;&lt; \"Kount: \" &lt;&lt; m_kount \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&lt; \" Ratio: \" &lt;&lt; m_ratio\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&lt; \" Msg: \" &lt;&lt; m_msg;\r\n\u00a0\u00a0\u00a0 return txtStream.str();\r\n}<\/pre>\n<pre style=\"text-align: justify;\">#include \"Test3Class.h\"\r\n\r\nint main(int argc, char **argv)\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Test3Class b( 16);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Test3Class c( 3.1435);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Test3Class d( \"new message\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Values for b: \" &lt;&lt; b.dumpValues() &lt;&lt; std::endl;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Values for c: \" &lt;&lt; c.dumpValues() &lt;&lt; std::endl;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::cout &lt;&lt; \"Values for d: \" &lt;&lt; d.dumpValues() &lt;&lt; std::endl;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;\r\n}<\/pre>\n<pre style=\"text-align: justify;\">Constructor (int): kount: 16 ratio: 3.45 msg: default message\r\nConstructor (double): kount: 10 ratio: 3.1435 msg: default message\r\nConstructor (std::string): kount: 10 ratio: 3.45 msg: new message\r\nValues for b: Kount: 16 Ratio: 3.45 Msg: default message\r\nValues for c: Kount: 10 Ratio: 3.1435 Msg: default message\r\nValues for d: Kount: 10 Ratio: 3.45 Msg: new message\r\nPress ENTER to continue...<\/pre>\n<p style=\"text-align: justify;\">For the next post in this series I propose to write a C++ 11 test program you can use to determine if your compiler takes the &#8220;last one in wins&#8221; approach or really does selectively add.<\/p>\n<p style=\"text-align: justify;\">\n","protected":false},"excerpt":{"rendered":"<p>One of the many reasons medical devices and all systems where adverse outcome for humans are slow to adopt &#8220;new&#8221; things is that there is so little known about &#8220;the wrong way.&#8221; You will find many snippets and books on-line professing to show you &#8220;the write way&#8221; but so few show you the wrong way and explain why it is the wrong way. Most of the token few wrong way post and book examples you &hellip; <a title=\"C++ 11 and Qt \u2014 Part 3 This is Broken\" class=\"bnm-read-more\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/\"><span class=\"screen-reader-text\">C++ 11 and Qt \u2014 Part 3 This is Broken<\/span>Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":4483,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,1113],"tags":[1182,1186],"class_list":["post-1847","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-information-technology","category-raspberry-pi","tag-c-11","tag-constructor-initializer-lists","bnm-entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C++ 11 and Qt \u2014 Part 3 This is Broken &#8211; Logikal Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++ 11 and Qt \u2014 Part 3 This is Broken &#8211; Logikal Blog\" \/>\n<meta property=\"og:description\" content=\"One of the many reasons medical devices and all systems where adverse outcome for humans are slow to adopt &#8220;new&#8221; things is that there is so little known about &#8220;the wrong way.&#8221; You will find many snippets and books on-line professing to show you &#8220;the write way&#8221; but so few show you the wrong way and explain why it is the wrong way. Most of the token few wrong way post and book examples you &hellip; C++ 11 and Qt \u2014 Part 3 This is BrokenRead more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/\" \/>\n<meta property=\"og:site_name\" content=\"Logikal Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-08-22T16:27:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-17T12:25:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2019\/01\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"1093\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/b87acf3335e19871db8f4a1aca03736c\"},\"headline\":\"C++ 11 and Qt \u2014 Part 3 This is Broken\",\"datePublished\":\"2016-08-22T16:27:26+00:00\",\"dateModified\":\"2024-09-17T12:25:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/\"},\"wordCount\":1032,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg\",\"keywords\":[\"C++ 11\",\"constructor initializer lists\"],\"articleSection\":[\"Information Technology\",\"Raspberry Pi\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/\",\"name\":\"C++ 11 and Qt \u2014 Part 3 This is Broken &#8211; Logikal Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg\",\"datePublished\":\"2016-08-22T16:27:26+00:00\",\"dateModified\":\"2024-09-17T12:25:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg\",\"width\":1500,\"height\":1093},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/c-11-and-qt-part-3-this-is-broken\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C++ 11 and Qt \u2014 Part 3 This is Broken\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\",\"name\":\"Logikal Blog\",\"description\":\"For people with attention spans longer than a Tweet\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\",\"name\":\"seasoned_geek\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"caption\":\"seasoned_geek\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\"},\"description\":\"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\\\/Qt touchscreen\\\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \\\"Zinc It!\\\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \\\"The Minimum You Need to Know to Be an OpenVMS Application Developer\\\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \\\"The Minimum You Need to Know\\\" book series was born. Three years later he wrote his first novel \\\"Infinite Exposure\\\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \\\"The Earth That Was\\\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.\",\"sameAs\":[\"https:\\\/\\\/theminimumyouneedtoknow.com\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/b87acf3335e19871db8f4a1aca03736c\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r\",\"caption\":\"admin\"},\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C++ 11 and Qt \u2014 Part 3 This is Broken &#8211; Logikal Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/","og_locale":"en_US","og_type":"article","og_title":"C++ 11 and Qt \u2014 Part 3 This is Broken &#8211; Logikal Blog","og_description":"One of the many reasons medical devices and all systems where adverse outcome for humans are slow to adopt &#8220;new&#8221; things is that there is so little known about &#8220;the wrong way.&#8221; You will find many snippets and books on-line professing to show you &#8220;the write way&#8221; but so few show you the wrong way and explain why it is the wrong way. Most of the token few wrong way post and book examples you &hellip; C++ 11 and Qt \u2014 Part 3 This is BrokenRead more","og_url":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/","og_site_name":"Logikal Blog","article_published_time":"2016-08-22T16:27:26+00:00","article_modified_time":"2024-09-17T12:25:38+00:00","og_image":[{"width":1500,"height":1093,"url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2019\/01\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#article","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/"},"author":{"name":"admin","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/b87acf3335e19871db8f4a1aca03736c"},"headline":"C++ 11 and Qt \u2014 Part 3 This is Broken","datePublished":"2016-08-22T16:27:26+00:00","dateModified":"2024-09-17T12:25:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/"},"wordCount":1032,"commentCount":0,"publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2019\/01\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg","keywords":["C++ 11","constructor initializer lists"],"articleSection":["Information Technology","Raspberry Pi"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/","url":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/","name":"C++ 11 and Qt \u2014 Part 3 This is Broken &#8211; Logikal Blog","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#primaryimage"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2019\/01\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg","datePublished":"2016-08-22T16:27:26+00:00","dateModified":"2024-09-17T12:25:38+00:00","breadcrumb":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#primaryimage","url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2019\/01\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg","contentUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2019\/01\/cropped-IMG_2019-01-01_12-31-33-1-1.jpeg","width":1500,"height":1093},{"@type":"BreadcrumbList","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/c-11-and-qt-part-3-this-is-broken\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.logikalsolutions.com\/wordpress\/"},{"@type":"ListItem","position":2,"name":"C++ 11 and Qt \u2014 Part 3 This is Broken"}]},{"@type":"WebSite","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website","url":"https:\/\/www.logikalsolutions.com\/wordpress\/","name":"Logikal Blog","description":"For people with attention spans longer than a Tweet","publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.logikalsolutions.com\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842","name":"seasoned_geek","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","url":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","caption":"seasoned_geek"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r"},"description":"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\/Qt touchscreen\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \"Zinc It!\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \"The Minimum You Need to Know to Be an OpenVMS Application Developer\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \"The Minimum You Need to Know\" book series was born. Three years later he wrote his first novel \"Infinite Exposure\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \"The Earth That Was\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.","sameAs":["https:\/\/theminimumyouneedtoknow.com"]},{"@type":"Person","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/b87acf3335e19871db8f4a1aca03736c","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r","url":"https:\/\/secure.gravatar.com\/avatar\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r","caption":"admin"},"url":"https:\/\/www.logikalsolutions.com\/wordpress\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/1847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/comments?post=1847"}],"version-history":[{"count":0,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/1847\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media\/4483"}],"wp:attachment":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media?parent=1847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/categories?post=1847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/tags?post=1847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}