{"id":359,"date":"2015-04-19T21:40:31","date_gmt":"2015-04-19T20:40:31","guid":{"rendered":"http:\/\/www.pixnbgames.com\/blog\/?p=359"},"modified":"2015-05-16T09:21:57","modified_gmt":"2015-05-16T08:21:57","slug":"referencias-cruzadas-en-c","status":"publish","type":"post","link":"https:\/\/www.pixnbgames.com\/blog\/c\/referencias-cruzadas-en-c\/","title":{"rendered":"Referencias cruzadas en C++"},"content":{"rendered":"<h1>\u00bfQu\u00e9 son las referencias cruzadas?<\/h1>\n<p style=\"text-align: justify;\">Llamamos referencias cruzadas a la situaci\u00f3n en la que una clase A necesita hacer referencia a una clase B, y a su vez la clase B necesita hacer referencia la clase A.<\/p>\n<p style=\"text-align: justify;\">Por ejemplo, supongamos que tenemos una aplicaci\u00f3n encargada de la gesti\u00f3n de un taller, donde cada mec\u00e1nico est\u00e1 arreglando un coche\u00a0en cada momento. Tenemos que acceder desde el mec\u00e1nico a su coche y desde el coche al mec\u00e1nico asignado. Nuestros archivos de cabecera podr\u00edan ser algo as\u00ed:<\/p>\n<h2 style=\"text-align: justify;\"><em>Mecanico.h<\/em><\/h2>\n<pre lang=\"Cpp\" line=\"1\">#ifndef _MECANICO_H_\r\n#define _MECANICO_H_\r\n\r\n#include \"Coche.h\"\r\n\r\nclass Mecanico {\r\npublic:\r\n    void arreglaCoche(Coche* coche);\r\nprivate:\r\n    Coche* _coche;\r\n}\r\n\r\n#endif \/\/ _MECANICO_H_\r\n<\/pre>\n<h2 style=\"text-align: justify;\"><em>Coche.h<\/em><\/h2>\n<pre lang=\"Cpp\" line=\"1\">#ifndef _COCHE_H_\r\n#define _COCHE_H_\r\n\r\n#include \"Mecanico.h\"\r\n\r\nclass Coche {\r\npublic:\r\n    void asignaMecanico(Mecanico* mecanico);\r\nprivate:\r\n    Mecanico* _mecanico;\r\n}\r\n\r\n#endif \/\/ _COCHE_H_\r\n<\/pre>\n<p style=\"text-align: justify;\">Sin embargo, si intentamos compilar el ejemplo anterior obtendremos un error, ya el que el compilador intenta compilar una de las clases, por ejemplo la clase <code>Mecanico<\/code>. Se encuentra entonces con que para poder compilar la clase <code>Mecanico<\/code>, necesita la clase <code>Coche<\/code>. Entonces intenta compilar la clase <code>Coche<\/code> y se encuentra que ahora necesita la clase <code>Mecanico<\/code>, que todav\u00eda no est\u00e1 compilada. Al necesitarse las dos clases m\u00fatuamente, es imposible para el compilador continuar.<\/p>\n<h2>Soluci\u00f3n<\/h2>\n<p style=\"text-align: justify;\">La forma en la que podemos corregir esto en C++ es bastante simple. Tendremos una de las clases exactamente igual a como la ten\u00edamos anteriormente. Por ejemplo, dejamos tal cual la clase <code>Mecanico<\/code>:<\/p>\n<h2 style=\"text-align: justify;\"><em>Mecanico.h<\/em><\/h2>\n<pre lang=\"Cpp\" line=\"1\">#ifndef _MECANICO_H_\r\n#define _MECANICO_H_\r\n\r\n#include \"Coche.h\"\r\n\r\nclass Mecanico {\r\npublic:\r\n    void arreglaCoche(Coche* coche);\r\nprivate:\r\n    Coche* _coche;\r\n}\r\n\r\n#endif \/\/ _MECANICO_H_\r\n<\/pre>\n<p style=\"text-align: justify;\">En la clase <code>Coche<\/code>, sin embargo, introducimos un par de cambios. Por un lado, eliminamos el <code>#include<\/code> de <em>Mecanico.h<\/em>. Y por otro lado, declaramos\u00a0que existe una clase <code>Mecanico<\/code>, pero no la definimos.<\/p>\n<h2 style=\"text-align: justify;\"><em>Coche.h<\/em><\/h2>\n<pre lang=\"Cpp\" line=\"1\">#ifndef _COCHE_H_\r\n#define _COCHE_H_\r\n\r\nclass Mecanico;\r\n\r\nclass Coche {\r\npublic:\r\n    void asignaMecanico(Mecanico* mecanico);\r\nprivate:\r\n    Mecanico* _mecanico;\r\n}\r\n\r\n#endif \/\/ _COCHE_H_\r\n<\/pre>\n<p style=\"text-align: justify;\">De esta forma podremos compilar nuestro programa salvando la problem\u00e1tica de las referencias cruzadas.<\/p>\n<p style=\"text-align: justify;\">\u00a1Saludos!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 son las referencias cruzadas? Llamamos referencias cruzadas a la situaci\u00f3n en la que una clase A necesita hacer referencia a una clase B, y a su vez la clase B necesita hacer referencia la clase A. Por ejemplo, supongamos <a class=\"more-link\" href=\"https:\/\/www.pixnbgames.com\/blog\/c\/referencias-cruzadas-en-c\/\">Seguir leyendo <span class=\"screen-reader-text\">  Referencias cruzadas en C++<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[28],"tags":[31,30],"language":[5],"_links":{"self":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts\/359"}],"collection":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/comments?post=359"}],"version-history":[{"count":7,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts\/359\/revisions"}],"predecessor-version":[{"id":366,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts\/359\/revisions\/366"}],"wp:attachment":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/media?parent=359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/categories?post=359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/tags?post=359"},{"taxonomy":"language","embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/language?post=359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}