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