Есть четыре класса Object, Sprite, Texture, Vector (приведены для примера). Каждый класс описан в своём h файле, а реализирован в cpp. В реализации в #include указан только свой класс, в описании, если классу нужна информация о другом классе указывается #include "Object.h".
Никакого наследования в данном случаи нет, "Object.h" выбран для централизованного управления проектом, на сколько это может быть возможно.
Однако схема ломается при реализации Sprite и Texture. Первому необходим доступ ко второму, да вот проблема, второму нужен так же доступ к Object. При сборе, при сохранении описанной выше схеме, получается несколько проходов по Sprite. При одном из таких, на этапе обработки Texture.cpp, обнаруживается неизвестный (Texture) тип используется в классе Sprite.
- Код: Выделить всё
------ Rebuild All started: Project: Lib, Configuration: Debug Win32 ------
Compiling...
Sprite.cpp
Texture.cpp
.\sprite.h(25) : error C2143: syntax error : missing ';' before '*'
.\sprite.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
.\sprite.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Vector.cpp
Object.cpp
.\sprite.h(25) : error C2143: syntax error : missing ';' before '*'
.\sprite.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
.\sprite.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Generating Code...
Lib - 6 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
Для решение проблемы была нарушена, описанная в первом абзаце, схема: изменено содержание Sprite.h, Texture.h на следующее. Закомментировано то, как должно быть, согласно первому абзацу.
- Код: Выделить всё
//Texture.h
#ifndef __TEXTURE_H_
#define __TEXTURE_H_
//#include "Object.h"
#include "Sprite.h"
/*namespace ObjectSpace
{
class Texture
{
public:
Texture();
};
};*/
#endif
//Sprite.h
#ifndef __SPRITE_H_
#define __SPRITE_H_
#include "Object.h"
namespace ObjectSpace
{
/*<!-Этого не должно быть в Sprite.h-!>*/
class Texture
{
public:
Texture();
};
/*<!-Этого не должно быть в Sprite.h-!>*/
enum CollisionType
{
COLLISION_NONE = 0,
COLLISION_RECT = 1,
COLLISION_DIST = 2
};
class Sprite
{
protected:
Texture *image;
Vector pos;
public:
Sprite();
};
};
#endif
Как поступить? Ведь оставлять такое положение дел будет не правильно.
В этом примере, случай с Vector отработал нормально, так как последнему не нужно знать про другие классы.
P.S.
Во вложении в папке msvc9 проект для Visual C++ 2008.
Всем спасибо за внимание.