Guest User

Untitled

a guest
Jul 20th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. class B;
  2. class A
  3. {
  4. int _val;
  5. B *_b;
  6. public:
  7.  
  8. A(int val)
  9. :_val(val)
  10. {
  11. }
  12.  
  13. void SetB(B *b)
  14. {
  15. _b = b;
  16. _b->Print(); // COMPILER ERROR: C2027: use of undefined type 'B'
  17. }
  18.  
  19. void Print()
  20. {
  21. cout<<"Type:A val="<<_val<<endl;
  22. }
  23. };
  24.  
  25. #include "A.h"
  26. class B
  27. {
  28. double _val;
  29. A* _a;
  30. public:
  31.  
  32. B(double val)
  33. :_val(val)
  34. {
  35. }
  36.  
  37. void SetA(A *a)
  38. {
  39. _a = a;
  40. _a->Print();
  41. }
  42.  
  43. void Print()
  44. {
  45. cout<<"Type:B val="<<_val<<endl;
  46. }
  47. };
  48.  
  49. #include "B.h"
  50. #include <iostream>
  51.  
  52. int main(int argc, char* argv[])
  53. {
  54. A a(10);
  55. B b(3.14);
  56. a.Print();
  57. a.SetB(&b);
  58. b.Print();
  59. b.SetA(&a);
  60. return 0;
  61. }
  62.  
  63. // file: A.h
  64. class A {
  65. B _b;
  66. };
  67.  
  68. // file: B.h
  69. class B {
  70. A _a;
  71. };
  72.  
  73. // file main.cc
  74. #include "A.h"
  75. #include "B.h"
  76. int main(...) {
  77. A a;
  78. }
  79.  
  80. // file: A.h
  81. class A {
  82. // both these are fine, so are various const versions of the same.
  83. B& _b_ref;
  84. B* _b_ptr;
  85. };
  86.  
  87. // file: main.cc
  88. #include "A.h" // <-- Houston, we have a problem
  89.  
  90. // file: partially_pre_processed_main.cc
  91. class A {
  92. B& _b_ref;
  93. B* _b_ptr;
  94. };
  95. #include "B.h"
  96. int main (...) {
  97. A a;
  98. }
  99.  
  100. // main.cc
  101. class B;
  102. #include "A.h"
  103. #include "B.h"
  104. int main (...) {
  105. A a;
  106. }
  107.  
  108. // file: A.h
  109. class B;
  110. class A {
  111. B* _b; // or any of the other variants.
  112. };
  113.  
  114. // file: B.h
  115. #include "A.h"
  116. class B {
  117. // note that this is cool because the compiler knows by this time
  118. // how much space A will need.
  119. A _a;
  120. }
  121.  
  122. //A.h
  123. #ifndef A_H
  124. #define A_H
  125. class B;
  126. class A
  127. {
  128. int _val;
  129. B* _b;
  130. public:
  131.  
  132. A(int val);
  133. void SetB(B *b);
  134. void Print();
  135. };
  136. #endif
  137.  
  138. //B.h
  139. #ifndef B_H
  140. #define B_H
  141. class A;
  142. class B
  143. {
  144. double _val;
  145. A* _a;
  146. public:
  147.  
  148. B(double val);
  149. void SetA(A *a);
  150. void Print();
  151. };
  152. #endif
  153.  
  154. //A.cpp
  155. #include "A.h"
  156. #include "B.h"
  157.  
  158. #include <iostream>
  159.  
  160. using namespace std;
  161.  
  162. A::A(int val)
  163. :_val(val)
  164. {
  165. }
  166.  
  167. void A::SetB(B *b)
  168. {
  169. _b = b;
  170. cout<<"Inside SetB()"<<endl;
  171. _b->Print();
  172. }
  173.  
  174. void A::Print()
  175. {
  176. cout<<"Type:A val="<<_val<<endl;
  177. }
  178.  
  179. //B.cpp
  180. #include "B.h"
  181. #include "A.h"
  182. #include <iostream>
  183.  
  184. using namespace std;
  185.  
  186. B::B(double val)
  187. :_val(val)
  188. {
  189. }
  190.  
  191. void B::SetA(A *a)
  192. {
  193. _a = a;
  194. cout<<"Inside SetA()"<<endl;
  195. _a->Print();
  196. }
  197.  
  198. void B::Print()
  199. {
  200. cout<<"Type:B val="<<_val<<endl;
  201. }
  202.  
  203. //main.cpp
  204. #include "A.h"
  205. #include "B.h"
  206.  
  207. int main(int argc, char* argv[])
  208. {
  209. A a(10);
  210. B b(3.14);
  211. a.Print();
  212. a.SetB(&b);
  213. b.Print();
  214. b.SetA(&a);
  215. return 0;
  216. }
  217.  
  218. // File: A.h
  219. #ifndef __A_H__
  220. #define __A_H__
  221. class B;
  222. class A
  223. {
  224. int _val;
  225. B *_b;
  226. public:
  227. A(int val);
  228. void SetB(B *b);
  229. void Print();
  230. };
  231.  
  232. // Including class B for inline usage here
  233. #include "B.h"
  234.  
  235. inline A::A(int val) : _val(val)
  236. {
  237. }
  238.  
  239. inline void A::SetB(B *b)
  240. {
  241. _b = b;
  242. _b->Print();
  243. }
  244.  
  245. inline void A::Print()
  246. {
  247. cout<<"Type:A val="<<_val<<endl;
  248. }
  249.  
  250. #endif /* __A_H__ */
  251.  
  252. #pragma once
  253. class A;
  254.  
  255. #pragma once
  256. #include "a.fwd.h"
  257. #include "b.fwd.h"
  258.  
  259. class A
  260. {
  261. public:
  262. void f(B*);
  263. };
  264.  
  265. #pragma once
  266. class B;
  267.  
  268. #pragma once
  269. #include "b.fwd.h"
  270. #include "a.fwd.h"
  271.  
  272. class B
  273. {
  274. public:
  275. void f(A*);
  276. };
  277.  
  278. template <typename T> class Basic_B;
  279. typedef Basic_B<char> B;
  280.  
  281. template <typename T>
  282. class Basic_B
  283. {
  284. ...class definition...
  285. };
  286. typedef Basic_B<char> B;
  287.  
  288. //Printer.h
  289. class Printer {
  290. public:
  291. virtual Print() = 0;
  292. }
  293.  
  294. //A.h
  295. #include "Printer.h"
  296. class A: public Printer
  297. {
  298. int _val;
  299. Printer *_b;
  300. public:
  301.  
  302. A(int val)
  303. :_val(val)
  304. {
  305. }
  306.  
  307. void SetB(Printer *b)
  308. {
  309. _b = b;
  310. _b->Print();
  311. }
  312.  
  313. void Print()
  314. {
  315. cout<<"Type:A val="<<_val<<endl;
  316. }
  317. };
  318.  
  319. //B.h
  320. #include "Printer.h"
  321. class B: public Printer
  322. {
  323. double _val;
  324. Printer* _a;
  325. public:
  326.  
  327. B(double val)
  328. :_val(val)
  329. {
  330. }
  331.  
  332. void SetA(Printer *a)
  333. {
  334. _a = a;
  335. _a->Print();
  336. }
  337.  
  338. void Print()
  339. {
  340. cout<<"Type:B val="<<_val<<endl;
  341. }
  342. };
  343.  
  344. //main.cpp
  345. #include <iostream>
  346. #include "A.h"
  347. #include "B.h"
  348.  
  349. int main(int argc, char* argv[])
  350. {
  351. A a(10);
  352. B b(3.14);
  353. a.Print();
  354. a.SetB(&b);
  355. b.Print();
  356. b.SetA(&a);
  357. return 0;
  358. }
  359.  
  360. #ifndef A_H
  361. #define A_H
  362.  
  363. class B; //forward declaration
  364.  
  365. class A {
  366. public:
  367. B* b;
  368. };
  369. #endif //A_H
  370.  
  371. #ifndef B_H
  372. #define B_H
  373.  
  374. class A; //forward declaration
  375.  
  376. class B {
  377. public:
  378. A* a;
  379. };
  380. #endif //B_H
  381.  
  382. #include "a.h"
  383. #include "b.h"
  384.  
  385. int main() {
  386. A a;
  387. B b;
  388. a.b = &b;
  389. b.a = &a;
  390. }
  391.  
  392. // A_def.h
  393. #ifndef A_DEF_H
  394. #define A_DEF_H
  395.  
  396. class B;
  397. class A
  398. {
  399. int _val;
  400. B *_b;
  401.  
  402. public:
  403. A(int val);
  404. void SetB(B *b);
  405. void Print();
  406. };
  407. #endif
  408.  
  409. // B_def.h
  410. #ifndef B_DEF_H
  411. #define B_DEF_H
  412.  
  413. class A;
  414. class B
  415. {
  416. double _val;
  417. A* _a;
  418.  
  419. public:
  420. B(double val);
  421. void SetA(A *a);
  422. void Print();
  423. };
  424. #endif
  425.  
  426. // A.h
  427. #ifndef A_H
  428. #define A_H
  429.  
  430. #include "A_def.h"
  431. #include "B_def.h"
  432.  
  433. inline A::A(int val) :_val(val)
  434. {
  435. }
  436.  
  437. inline void A::SetB(B *b)
  438. {
  439. _b = b;
  440. _b->Print();
  441. }
  442.  
  443. inline void A::Print()
  444. {
  445. cout<<"Type:A val="<<_val<<endl;
  446. }
  447.  
  448. #endif
  449.  
  450. // B.h
  451. #ifndef B_H
  452. #define B_H
  453.  
  454. #include "A_def.h"
  455. #include "B_def.h"
  456.  
  457. inline B::B(double val) :_val(val)
  458. {
  459. }
  460.  
  461. inline void B::SetA(A *a)
  462. {
  463. _a = a;
  464. _a->Print();
  465. }
  466.  
  467. inline void B::Print()
  468. {
  469. cout<<"Type:B val="<<_val<<endl;
  470. }
  471.  
  472. #endif
Add Comment
Please, Sign In to add comment