2013-09-15 4 views
1

Я - разработчик игр, и я хочу сделать простую платформенную игру на C++. Проблема в том, что когда я делаю два класса (игра и графика), я не могу включить Game.h в Graphics.h, потому что я уже включил Graphics.h в Game.h. Кто-нибудь может мне помочь? код: Game.h:C++ include loop

#pragma once 

#include "Graphics.h" 

struct Game { 
    Game(); 

    void init(); 
    void handle(); 

    bool running; 

    Graphics g; 
}; 

graphics.h:

#pragma once 

#include <SDL.h> 

struct Graphics { 
    SDL_Surface* screen; 

    void init(); 

    void rect(SDL_Rect rect, Uint32 color); 
    void rect(SDL_Rect rect, int r, int g, int b); 
    void rect(int x, int y, int w, int h, Uint32 color); 
    void rect(int x, int y, int w, int h, int r, int g, int b); 

    void render(Game* game); 
}; 
+3

Избегайте как можно большего добавления #includes .h файлов, помещайте наиболее используемый заголовок в общий файл .h (я вызываю мой PCH.h) и включаю этот заголовок в начале каждого файла cpp и поворачиваю на предварительно скомпилированных заголовках из вашей IDE или создать скрипт. Это может показаться сложным, но в конечном итоге это сэкономит вам массу проблем. –

+0

нет причин действительно иметь один заголовок для каждого класса. – mcr619619

+0

Будьте осторожны с этой общей идеей заголовка: по моему опыту, он быстро выходит из-под контроля и заканчивается с множеством ненужных зависимостей. В общем, включите то, что вам нужно, и только то, что вам нужно. – juanchopanza

ответ

8

Вы можете использовать опережающее объявление здесь:

#ifndef GRAPHICS_H_ // portable include guards 
#define GRAPHICS_H_ 

#include <SDL.h> 

class Game; // forward declaration. Exactly the same as struct Game. 

struct Graphics 
{ 
    // as before 
}; 

#endif 

потому Graphics не требует определения Game. Скорее всего, вам необходимо включить Game.h в файл реализации Graphics.

Показать похожий пост: When to use forward declaration?

+0

Я думаю, что лучше быть более последовательным и использовать 'struct Game'. – kennytm

+0

@KennyTM Возможно. Это не то, о чем я беспокоюсь. Я добавил комментарий. – juanchopanza

+0

Спасибо! оно работает! – ionagamed

1

Вы можете иметь один заголовок слияния оба Game.h и Graphic.h; нет причин иметь один заголовок для каждого класса.

Если вы используете GCC (тогда скомпилируйте с g++ -Wall -g), преимущество иметь только один заголовок для всего проекта - это возможность precompile your header. См. Также this answer.