FAQ:WinAPI VCPP:взаимные зависимости классов
Материал из Весельчак У
Имеется класс Class1, содержащий член типа "Class2*". А в Class2 имеется член типа "Class1*". Компилятор выдаёт ошибку. Что надо делать?
Перекрёстное определение обходится следующим образом: код обоих классов разносится в пары файлов *.h и *.cpp, а перед каждым классом прописывается предопределение другого класса:
Файл "class1.h":
class Class2; // предопределение Class2 class Class1 { Class2* m_p2; // компилятор разрешит объявление указателя Class2* void F1(Class2* p); //компилятор разрешит объявление указателя Class2* void F2(Class1* p); };
Файл "class1.cpp":
#include "class1.h" #include "class2.h" void Class1::F1(Class2* p) { // ... } void Class1::F2(Class1* p) { // ... }
Файл "class2.h":
class Class1; // предопределение Class1 Class2 { Class1* m_p1; // компилятор разрешит объявление указателя Class1* void F3(Class1* p); // компилятор разрешит объявление указателя Class1* };
Файл "class2.cpp":
#include "class2.h" #include "class1.h" void Class2::F3(Class1* p) { // ... }
После предопределения класса компилятор позволяет объявлять указатель на класс, так как переменная указателя на любой тип имеет всегда один и тот же размер (4 байта).