С++ Особенности препроцессинга директивы #include

Вопросы по языкам программирования Си и С++.
Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

С++ Особенности препроцессинга директивы #include

Сообщение Admiralisimys » 16.04.2011 (Сб) 18:46

Всем доброго дня.
Есть четыре класса 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 на следующее. :idea: Закомментировано то, как должно быть, согласно первому абзацу. :roll:

Код: Выделить всё
//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.
Во вложении
ClassesDemo.zip
(4.06 Кб) Скачиваний: 305
в папке msvc9 проект для Visual C++ 2008.
Всем спасибо за внимание. 8)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: С++ Особенности препроцессинга директивы #include

Сообщение Хакер » 16.04.2011 (Сб) 18:53

Admiralisimys писал(а): в описании, если классу нужна информация о другом классе указывается #include "Object.h".

Вообще, есть популярное правило. h-файлы не должны подключать другие h-файлы. Разумеется, речь идёт не о случае, пободном отношениям между windows.h и winbase.h.

Admiralisimys писал(а):Как поступить? Ведь оставлять такое положение дел будет не правильно.

Придумать рацоинальную схему распределения объявлений по h-файлам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: С++ Особенности препроцессинга директивы #include

Сообщение Admiralisimys » 16.04.2011 (Сб) 19:29

Спасибо Хакер, то что нужно
Код: Выделить всё
//Object.cpp
#include "Object.h"

//Sprite.cpp
#include "Vector.h"
#include "Texture.h"
#include "Sprite.h"

//Texture.cpp
#include "Object.h"
#include "Texture.h"

//"Vector.cpp"
#include "Vector.h"

Меня что подкупало, что достаточно будет указать Object.h, дабы получить все интерфейсы библиотеки.
Но лучше уж потрудится и перечислить всё что нужно, чем дать разрастаться спагетти коду библиотеки (ну какое отношение имеет Texture к описанию Sprite).

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: С++ Особенности препроцессинга директивы #include

Сообщение SLIM » 16.04.2011 (Сб) 22:46

Хакер писал(а):Вообще, есть популярное правило. h-файлы не должны подключать другие h-файлы. Разумеется, речь идёт не о случае, пободном отношениям между windows.h и winbase.h.

А если такая ситуация.
Есть некий объект, например какая-то структура, она объявлена в каком-то h. и с ним работает основная программа.
Далее, есть например библиотека, которая также работает с этой же структурой. В ней объявляются функции, описываются они в каком-то другом h., но уже в библе. Эти функции принимают параметры той самой структуры.
Как в таком случае не включать h. в h.?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: С++ Особенности препроцессинга директивы #include

Сообщение Хакер » 16.04.2011 (Сб) 22:49

Дерево зависимостей нарисуй. Два дерева или три дерева, например.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: С++ Особенности препроцессинга директивы #include

Сообщение SLIM » 16.04.2011 (Сб) 23:49

Изображение
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: С++ Особенности препроцессинга директивы #include

Сообщение Хакер » 16.04.2011 (Сб) 23:59

Это не то.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: С++ Особенности препроцессинга директивы #include

Сообщение SLIM » 17.04.2011 (Вс) 0:04

Я на спорю что это не то.
Что делать в такой ситуации следя твоему правилу?
А лучше, что делать при более ярком примере?
Я просто обычно использую
Код: Выделить всё
#pragma once

Изображение
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: С++ Особенности препроцессинга директивы #include

Сообщение Хакер » 17.04.2011 (Вс) 0:25

Схема не та. Даже (не говоря об информативности) размером.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: С++ Особенности препроцессинга директивы #include

Сообщение SLIM » 17.04.2011 (Вс) 1:22

В прошлый раз тебе маленькая была :)
Ну ладно, не так так не та...
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList