{"id":91817,"date":"2022-10-12T06:10:38","date_gmt":"2022-10-12T11:10:38","guid":{"rendered":"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/"},"modified":"2022-10-12T06:10:38","modified_gmt":"2022-10-12T11:10:38","slug":"vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det","status":"publish","type":"post","link":"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/","title":{"rendered":"Vad \u00e4r diamantproblemet i C++? Hur man hittar det och hur man fixar det"},"content":{"rendered":"<div>\n<p>Multipelarv i C++ \u00e4r kraftfullt, men ett knepigt verktyg som ofta leder till problem om det inte anv\u00e4nds f\u00f6rsiktigt \u2013 problem som Diamond Problem.<\/p>\n<p>I den h\u00e4r artikeln kommer vi att diskutera diamantproblemet, hur det uppst\u00e5r fr\u00e5n multipelt arv och vad du kan g\u00f6ra f\u00f6r att l\u00f6sa problemet.<\/p>\n<h2 id=\"multiple-inheritance-in-c\"><span class=\"ez-toc-section\" id=\"Multipelt_arv_i_C\"><\/span>  Multipelt arv i C++<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Multiple Inheritance \u00e4r en funktion i Object-Oriented Programming (OOP) d\u00e4r en underklass kan \u00e4rva fr\u00e5n mer \u00e4n en superklass.  Med andra ord kan en barnklass ha mer \u00e4n en f\u00f6r\u00e4lder.<\/p>\n<p>Figuren nedan visar en bildrepresentation av flera arv.<\/p>\n<figure>\n<\/figure>\n<p>I diagrammet ovan, <strong>klass C<\/strong> har <strong>klass A<\/strong> och <strong>klass B<\/strong> som sina f\u00f6r\u00e4ldrar.<\/p>\n<p>Om vi \u200b\u200bbetraktar ett verkligt scenario, \u00e4rver ett barn fr\u00e5n sin far och mor.  S\u00e5 ett barn kan representeras som en h\u00e4rledd klass med \u201cFar\u201d och \u201cMor\u201d som sina f\u00f6r\u00e4ldrar.  P\u00e5 samma s\u00e4tt kan vi ha m\u00e5nga s\u00e5dana verkliga exempel p\u00e5 multipelt arv.<\/p>\n<p>Vid multipelarv exekveras konstrukt\u00f6rerna av en \u00e4rvd klass i den ordning som de \u00e4rvs.  \u00c5 andra sidan avr\u00e4ttas f\u00f6rst\u00f6rare i omv\u00e4nd ordning av deras arv.<\/p>\n<p>L\u00e5t oss nu illustrera det multipla arvet och verifiera ordningen f\u00f6r konstruktion och f\u00f6rst\u00f6relse av f\u00f6rem\u00e5l.<\/p>\n<h3 id=\"code-illustration-of-multiple-inheritance\"><span class=\"ez-toc-section\" id=\"Kodillustration_av_multipelarv\"><\/span>Kodillustration av multipelarv<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>F\u00f6r multipelarvsillustrationen har vi exakt programmerat ovanst\u00e5ende representation i C++.  Koden f\u00f6r programmet finns nedan.<\/p>\n<pre>#include&lt;iostream&gt;<br\/>using namespace std; <br\/>class A \/\/base class A with constructor and destructor<br\/>{<br\/>public:<br\/>A() { cout &lt;&lt; \"class A::Constructor\" &lt;&lt; endl; }<br\/>~A() { cout &lt;&lt; \"class A::Destructor\" &lt;&lt; endl; }<br\/>};<br\/>class B \/\/base class B with constructor and destructor<br\/>{<br\/>public:<br\/>B() { cout &lt;&lt; \"class B::Constructor\" &lt;&lt; endl; }<br\/>~B() { cout &lt;&lt; \"class B::Destructor\" &lt;&lt; endl; }<br\/>};<br\/>class C: public B, public A \/\/derived class C inherits class A and then class B (note the order)<br\/>{<br\/>public:<br\/>C() { cout &lt;&lt; \"class C::Constructor\" &lt;&lt; endl; }<br\/>~C() { cout &lt;&lt; \"class C::Destructor\" &lt;&lt; endl; }<br\/>};<br\/>int main(){<br\/>C c;<br\/>return 0;<br\/>}<\/pre>\n<p>Resultatet vi f\u00e5r fr\u00e5n ovanst\u00e5ende program \u00e4r f\u00f6ljande:<\/p>\n<pre>class B::Constructor<br\/>class A::Constructor<br\/>class C::Constructor<br\/>class C::Destructor<br\/>class A::Destructor<br\/>class B::Destructor<\/pre>\n<p>Om vi \u200b\u200bnu kontrollerar utg\u00e5ngen ser vi att konstrukt\u00f6rerna anropas i ordning B, A och C medan destrukt\u00f6rerna \u00e4r i omv\u00e4nd ordning.  Nu n\u00e4r vi k\u00e4nner till grunderna f\u00f6r multipelt arv g\u00e5r vi vidare f\u00f6r att diskutera diamantproblemet.<\/p>\n<h2 id=\"the-diamond-problem-explained\"><span class=\"ez-toc-section\" id=\"Diamantproblemet_forklarat\"><\/span>  Diamantproblemet, f\u00f6rklarat<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Diamantproblemet uppst\u00e5r n\u00e4r en barnklass \u00e4rver fr\u00e5n tv\u00e5 f\u00f6r\u00e4ldraklasser som b\u00e5da delar en gemensam farf\u00f6r\u00e4lderklass.  Detta illustreras i diagrammet nedan:<\/p>\n<figure>\n<\/figure>\n<p>H\u00e4r har vi en klass <strong>Barn<\/strong> \u00e4rver fr\u00e5n klasser <strong>Far<\/strong> och <strong>Mor<\/strong>.  Dessa tv\u00e5 klasser \u00e4rver i sin tur klassen <strong>Person<\/strong> eftersom b\u00e5de far och mor \u00e4r person.<\/p>\n<p>Som visas i figuren \u00e4rver klassbarn egenskaperna hos klassperson tv\u00e5 g\u00e5nger \u2013 en g\u00e5ng fr\u00e5n far och igen fr\u00e5n mor.  Detta ger upphov till tvetydighet eftersom kompilatorn inte f\u00f6rst\u00e5r vilken v\u00e4g den ska g\u00e5.<\/p>\n<p>Detta scenario ger upphov till en diamantformad arvsgraf och kallas k\u00e4nd som \u201cDiamondproblemet\u201d.<\/p>\n<h3 id=\"code-illustration-of-the-diamond-problem\"><span class=\"ez-toc-section\" id=\"Kodillustration_av_diamantproblemet\"><\/span>Kodillustration av diamantproblemet<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nedan har vi representerat ovanst\u00e5ende exempel p\u00e5 diamantformat arv programmatiskt.  Koden ges nedan:<\/p>\n<pre>#include&lt;iostream&gt;<br\/>using namespace std;<br\/>class Person { \/\/class Person<br\/>public:<br\/>Person(int x) { cout &lt;&lt; \"Person::Person(int) called\" &lt;&lt; endl; }<br\/>};<p>class Father : public Person { \/\/class Father inherits Person<br\/>public:<br\/>Father(int x):Person(x) {<br\/>cout &lt;&lt; \"Father::Father(int) called\" &lt;&lt; endl;<br\/>}<br\/>};<\/p><p>class Mother : public Person { \/\/class Mother inherits Person<br\/>public:<br\/>Mother(int x):Person(x) {<br\/>cout &lt;&lt; \"Mother::Mother(int) called\" &lt;&lt; endl;<br\/>}<br\/>};<\/p><p>class Child : public Father, public Mother { \/\/Child inherits Father and Mother<br\/>public:<br\/>Child(int x):Mother(x), Father(x) {<br\/>cout &lt;&lt; \"Child::Child(int) called\" &lt;&lt; endl;<br\/>}<br\/>};<\/p><p>int main() {<br\/>Child child(30);<br\/>}<\/p><\/pre>\n<p>F\u00f6ljande \u00e4r resultatet av detta program:<\/p>\n<pre>Person::Person(int) called<br\/>Father::Father(int) called<br\/>Person::Person(int) called<br\/>Mother::Mother(int) called<br\/>Child::Child(int) called<\/pre>\n<p>Nu kan du se oklarheten h\u00e4r.  Klasskonstruktorn Person anropas tv\u00e5 g\u00e5nger: en g\u00e5ng n\u00e4r klassobjektet Father skapas och n\u00e4sta n\u00e4r klassobjektet Moder skapas.  Egenskaperna f\u00f6r klassen Person \u00e4rvs tv\u00e5 g\u00e5nger, vilket ger upphov till tvetydighet.<\/p>\n<p>Eftersom klasskonstruktorn Person anropas tv\u00e5 g\u00e5nger, kommer destruktorn ocks\u00e5 att anropas tv\u00e5 g\u00e5nger n\u00e4r klassobjektet Child f\u00f6rst\u00f6rs.<\/p>\n<p>Om du nu har f\u00f6rst\u00e5tt problemet korrekt, l\u00e5t oss diskutera l\u00f6sningen p\u00e5 diamantproblemet.<\/p>\n<h2 id=\"how-to-fix-the-diamond-problem-in-c\"><span class=\"ez-toc-section\" id=\"Hur_man_fixar_diamantproblemet_i_C\"><\/span>  Hur man fixar diamantproblemet i C++<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>L\u00f6sningen p\u00e5 diamantproblemet \u00e4r att anv\u00e4nda <strong>virtuell<\/strong> nyckelord.  Vi g\u00f6r de tv\u00e5 f\u00f6r\u00e4ldraklasserna (som \u00e4rver fr\u00e5n samma farf\u00f6r\u00e4lderklass) till virtuella klasser f\u00f6r att undvika tv\u00e5 kopior av farf\u00f6r\u00e4lderklassen i barnklassen.<\/p>\n<p>L\u00e5t oss \u00e4ndra illustrationen ovan och kontrollera utdata:<\/p>\n<h3 id=\"code-illustration-to-fix-the-diamond-problem\"><span class=\"ez-toc-section\" id=\"Kodillustration_for_att_atgarda_diamantproblemet\"><\/span>Kodillustration f\u00f6r att \u00e5tg\u00e4rda diamantproblemet<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<pre>#include&lt;iostream&gt;<br\/>using namespace std;<br\/>class Person { \/\/class Person<br\/>public:<br\/>Person() { cout &lt;&lt; \"Person::Person() called\" &lt;&lt; endl; } \/\/Base constructor<br\/>Person(int x) { cout &lt;&lt; \"Person::Person(int) called\" &lt;&lt; endl; }<br\/>};<p>class Father : virtual public Person { \/\/class Father inherits Person<br\/>public:<br\/>Father(int x):Person(x) {<br\/>cout &lt;&lt; \"Father::Father(int) called\" &lt;&lt; endl;<br\/>}<br\/>};<\/p><p>class Mother : virtual public Person { \/\/class Mother inherits Person<br\/>public:<br\/>Mother(int x):Person(x) {<br\/>cout &lt;&lt; \"Mother::Mother(int) called\" &lt;&lt; endl;<br\/>}<br\/>};<\/p><p>class Child : public Father, public Mother { \/\/class Child inherits Father and Mother<br\/>public:<br\/>Child(int x):Mother(x), Father(x) {<br\/>cout &lt;&lt; \"Child::Child(int) called\" &lt;&lt; endl;<br\/>}<br\/>};<\/p><p>int main() {<br\/>Child child(30);<br\/>}<\/p><\/pre>\n<p>H\u00e4r har vi anv\u00e4nt <strong>virtuell<\/strong> nyckelord n\u00e4r klasser far och mor \u00e4rver klassen Person.  Detta brukar kallas \u201cvirtuellt arv\u201d, vilket garanterar att endast en enda instans av den \u00e4rvda klassen (i det h\u00e4r fallet Person-klassen) f\u00f6rs vidare.<\/p>\n<p>Med andra ord kommer klassen Child att ha en enda instans av klassen Person, som delas av b\u00e5de far- och moderklasserna.  Genom att ha en enda instans av klassen Person l\u00f6ses tvetydigheten.<\/p>\n<p>Utdata fr\u00e5n ovanst\u00e5ende kod ges nedan:<\/p>\n<pre>Person::Person() called<br\/>Father::Father(int) called<br\/>Mother::Mother(int) called<br\/>Child::Child(int) called<\/pre>\n<p>H\u00e4r kan du se att klassen Personkonstrukt\u00f6r bara anropas en g\u00e5ng.<\/p>\n<p>En sak att notera om virtuellt arv \u00e4r att \u00e4ven om den parametriserade konstruktorn f\u00f6r klassen Person uttryckligen anropas av klasskonstrukt\u00f6rer f\u00f6r Fader och Mother genom initialiseringslistor, <strong>endast baskonstruktorn f\u00f6r klassen Person kommer att anropas<\/strong>.<\/p>\n<p>Detta beror p\u00e5 att det bara finns en enda instans av en virtuell basklass som delas av flera klasser som \u00e4rver fr\u00e5n den.<\/p>\n<p>F\u00f6r att f\u00f6rhindra att baskonstruktorn k\u00f6rs flera g\u00e5nger, anropas inte konstruktorn f\u00f6r en virtuell basklass av klassen som \u00e4rver fr\u00e5n den.  Ist\u00e4llet anropas konstrukt\u00f6ren av konstrukt\u00f6ren av betongklassen.<\/p>\n<p>I exemplet ovan anropar klassen Child direkt baskonstruktorn f\u00f6r klassen Person.<\/p>\n<p>Vad h\u00e4nder om du beh\u00f6ver k\u00f6ra den parametriserade konstruktorn f\u00f6r basklassen?  Du kan g\u00f6ra det genom att uttryckligen kalla det i barnklassen snarare \u00e4n i far- eller morklasserna.<\/p>\n<h2 id=\"the-diamond-problem-in-c-solved\"><span class=\"ez-toc-section\" id=\"Diamantproblemet_i_C_lost\"><\/span>  Diamantproblemet i C++, l\u00f6st<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Diamantproblemet \u00e4r en tvetydighet som uppst\u00e5r vid multipelt arv n\u00e4r tv\u00e5 f\u00f6r\u00e4ldraklasser \u00e4rver fr\u00e5n samma farf\u00f6r\u00e4lderklass, och b\u00e5da f\u00f6r\u00e4lderklasserna \u00e4rvs av en enda barnklass.  Utan att anv\u00e4nda virtuellt arv skulle barnklassen \u00e4rva farf\u00f6r\u00e4lderklassens egenskaper tv\u00e5 g\u00e5nger, vilket leder till tvetydighet.<\/p>\n<p>Detta kan dyka upp ofta i verklig kod, s\u00e5 det \u00e4r viktigt att ta itu med den oklarheten n\u00e4r den uppt\u00e4cks.<\/p>\n<p>Diamantproblemet \u00e5tg\u00e4rdas med hj\u00e4lp av virtuellt arv, d\u00e4r <strong>virtuell<\/strong> nyckelord anv\u00e4nds n\u00e4r f\u00f6r\u00e4ldraklasser \u00e4rver fr\u00e5n en delad farf\u00f6r\u00e4lderklass.  Genom att g\u00f6ra det g\u00f6rs bara en kopia av farf\u00f6r\u00e4lderklassen, och objektkonstruktionen av farf\u00f6r\u00e4lderklassen g\u00f6rs av barnklassen.<\/p>\n<p>    <strong class=\"section-sub-title\">Om f\u00f6rfattaren<\/strong><\/p>\n<p>            <strong class=\"bio-title\">Shilpa Nadkarni (1 artiklar publicerade)<br \/><\/strong><\/p>\n<p>                            Mer fr\u00e5n Shilpa Nadkarni<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Prenumerera_pa_vart_nyhetsbrev\"><\/span>Prenumerera p\u00e5 v\u00e5rt nyhetsbrev<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>G\u00e5 med i v\u00e5rt nyhetsbrev f\u00f6r tekniska tips, recensioner, free e-b\u00f6cker och exklusiva erbjudanden!<\/p>\n<p>Klicka h\u00e4r f\u00f6r att prenumerera<\/p>\n<\/p><\/div>\n  <div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Multipelt_arv_i_C\" >Multipelt arv i C++<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Kodillustration_av_multipelarv\" >Kodillustration av multipelarv<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Diamantproblemet_forklarat\" >Diamantproblemet, f\u00f6rklarat<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Kodillustration_av_diamantproblemet\" >Kodillustration av diamantproblemet<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Hur_man_fixar_diamantproblemet_i_C\" >Hur man fixar diamantproblemet i C++<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Kodillustration_for_att_atgarda_diamantproblemet\" >Kodillustration f\u00f6r att \u00e5tg\u00e4rda diamantproblemet<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Diamantproblemet_i_C_lost\" >Diamantproblemet i C++, l\u00f6st<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blogging-techies.com\/sw\/vad-ar-diamantproblemet-i-c-hur-man-hittar-det-och-hur-man-fixar-det\/#Prenumerera_pa_vart_nyhetsbrev\" >Prenumerera p\u00e5 v\u00e5rt nyhetsbrev<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n ","protected":false},"excerpt":{"rendered":"<p>Multipelarv i C++ \u00e4r kraftfullt, men ett knepigt verktyg som ofta leder till problem om det inte anv\u00e4nds f\u00f6rsiktigt \u2013 problem som Diamond Problem. I den h\u00e4r artikeln kommer vi att diskutera diamantproblemet, hur det uppst\u00e5r fr\u00e5n multipelt arv och vad du kan g\u00f6ra f\u00f6r att l\u00f6sa problemet. Multipelt arv i C++ Multiple Inheritance \u00e4r [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":91818,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[5],"tags":[24,29,45369,2331,1205,27,163,26,23],"class_list":["post-91817","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bloggar","tag-ar","tag-det","tag-diamantproblemet","tag-fixar","tag-hittar","tag-hur","tag-man","tag-och","tag-vad"],"_links":{"self":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/posts\/91817","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/comments?post=91817"}],"version-history":[{"count":0,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/posts\/91817\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/media\/91818"}],"wp:attachment":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/media?parent=91817"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/categories?post=91817"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/tags?post=91817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}