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 байта).