Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class B;
- class A
- {
- int _val;
- B *_b;
- public:
- A(int val)
- :_val(val)
- {
- }
- void SetB(B *b)
- {
- _b = b;
- _b->Print(); // COMPILER ERROR: C2027: use of undefined type 'B'
- }
- void Print()
- {
- cout<<"Type:A val="<<_val<<endl;
- }
- };
- #include "A.h"
- class B
- {
- double _val;
- A* _a;
- public:
- B(double val)
- :_val(val)
- {
- }
- void SetA(A *a)
- {
- _a = a;
- _a->Print();
- }
- void Print()
- {
- cout<<"Type:B val="<<_val<<endl;
- }
- };
- #include "B.h"
- #include <iostream>
- int main(int argc, char* argv[])
- {
- A a(10);
- B b(3.14);
- a.Print();
- a.SetB(&b);
- b.Print();
- b.SetA(&a);
- return 0;
- }
- // file: A.h
- class A {
- B _b;
- };
- // file: B.h
- class B {
- A _a;
- };
- // file main.cc
- #include "A.h"
- #include "B.h"
- int main(...) {
- A a;
- }
- // file: A.h
- class A {
- // both these are fine, so are various const versions of the same.
- B& _b_ref;
- B* _b_ptr;
- };
- // file: main.cc
- #include "A.h" // <-- Houston, we have a problem
- // file: partially_pre_processed_main.cc
- class A {
- B& _b_ref;
- B* _b_ptr;
- };
- #include "B.h"
- int main (...) {
- A a;
- }
- // main.cc
- class B;
- #include "A.h"
- #include "B.h"
- int main (...) {
- A a;
- }
- // file: A.h
- class B;
- class A {
- B* _b; // or any of the other variants.
- };
- // file: B.h
- #include "A.h"
- class B {
- // note that this is cool because the compiler knows by this time
- // how much space A will need.
- A _a;
- }
- //A.h
- #ifndef A_H
- #define A_H
- class B;
- class A
- {
- int _val;
- B* _b;
- public:
- A(int val);
- void SetB(B *b);
- void Print();
- };
- #endif
- //B.h
- #ifndef B_H
- #define B_H
- class A;
- class B
- {
- double _val;
- A* _a;
- public:
- B(double val);
- void SetA(A *a);
- void Print();
- };
- #endif
- //A.cpp
- #include "A.h"
- #include "B.h"
- #include <iostream>
- using namespace std;
- A::A(int val)
- :_val(val)
- {
- }
- void A::SetB(B *b)
- {
- _b = b;
- cout<<"Inside SetB()"<<endl;
- _b->Print();
- }
- void A::Print()
- {
- cout<<"Type:A val="<<_val<<endl;
- }
- //B.cpp
- #include "B.h"
- #include "A.h"
- #include <iostream>
- using namespace std;
- B::B(double val)
- :_val(val)
- {
- }
- void B::SetA(A *a)
- {
- _a = a;
- cout<<"Inside SetA()"<<endl;
- _a->Print();
- }
- void B::Print()
- {
- cout<<"Type:B val="<<_val<<endl;
- }
- //main.cpp
- #include "A.h"
- #include "B.h"
- int main(int argc, char* argv[])
- {
- A a(10);
- B b(3.14);
- a.Print();
- a.SetB(&b);
- b.Print();
- b.SetA(&a);
- return 0;
- }
- // File: A.h
- #ifndef __A_H__
- #define __A_H__
- class B;
- class A
- {
- int _val;
- B *_b;
- public:
- A(int val);
- void SetB(B *b);
- void Print();
- };
- // Including class B for inline usage here
- #include "B.h"
- inline A::A(int val) : _val(val)
- {
- }
- inline void A::SetB(B *b)
- {
- _b = b;
- _b->Print();
- }
- inline void A::Print()
- {
- cout<<"Type:A val="<<_val<<endl;
- }
- #endif /* __A_H__ */
- #pragma once
- class A;
- #pragma once
- #include "a.fwd.h"
- #include "b.fwd.h"
- class A
- {
- public:
- void f(B*);
- };
- #pragma once
- class B;
- #pragma once
- #include "b.fwd.h"
- #include "a.fwd.h"
- class B
- {
- public:
- void f(A*);
- };
- template <typename T> class Basic_B;
- typedef Basic_B<char> B;
- template <typename T>
- class Basic_B
- {
- ...class definition...
- };
- typedef Basic_B<char> B;
- //Printer.h
- class Printer {
- public:
- virtual Print() = 0;
- }
- //A.h
- #include "Printer.h"
- class A: public Printer
- {
- int _val;
- Printer *_b;
- public:
- A(int val)
- :_val(val)
- {
- }
- void SetB(Printer *b)
- {
- _b = b;
- _b->Print();
- }
- void Print()
- {
- cout<<"Type:A val="<<_val<<endl;
- }
- };
- //B.h
- #include "Printer.h"
- class B: public Printer
- {
- double _val;
- Printer* _a;
- public:
- B(double val)
- :_val(val)
- {
- }
- void SetA(Printer *a)
- {
- _a = a;
- _a->Print();
- }
- void Print()
- {
- cout<<"Type:B val="<<_val<<endl;
- }
- };
- //main.cpp
- #include <iostream>
- #include "A.h"
- #include "B.h"
- int main(int argc, char* argv[])
- {
- A a(10);
- B b(3.14);
- a.Print();
- a.SetB(&b);
- b.Print();
- b.SetA(&a);
- return 0;
- }
- #ifndef A_H
- #define A_H
- class B; //forward declaration
- class A {
- public:
- B* b;
- };
- #endif //A_H
- #ifndef B_H
- #define B_H
- class A; //forward declaration
- class B {
- public:
- A* a;
- };
- #endif //B_H
- #include "a.h"
- #include "b.h"
- int main() {
- A a;
- B b;
- a.b = &b;
- b.a = &a;
- }
- // A_def.h
- #ifndef A_DEF_H
- #define A_DEF_H
- class B;
- class A
- {
- int _val;
- B *_b;
- public:
- A(int val);
- void SetB(B *b);
- void Print();
- };
- #endif
- // B_def.h
- #ifndef B_DEF_H
- #define B_DEF_H
- class A;
- class B
- {
- double _val;
- A* _a;
- public:
- B(double val);
- void SetA(A *a);
- void Print();
- };
- #endif
- // A.h
- #ifndef A_H
- #define A_H
- #include "A_def.h"
- #include "B_def.h"
- inline A::A(int val) :_val(val)
- {
- }
- inline void A::SetB(B *b)
- {
- _b = b;
- _b->Print();
- }
- inline void A::Print()
- {
- cout<<"Type:A val="<<_val<<endl;
- }
- #endif
- // B.h
- #ifndef B_H
- #define B_H
- #include "A_def.h"
- #include "B_def.h"
- inline B::B(double val) :_val(val)
- {
- }
- inline void B::SetA(A *a)
- {
- _a = a;
- _a->Print();
- }
- inline void B::Print()
- {
- cout<<"Type:B val="<<_val<<endl;
- }
- #endif
Add Comment
Please, Sign In to add comment