2014-01-18 3 views
0

Я довольно новый программист, и я делаю небольшой игровой проект в Visual Studio/C++/SDL. Поэтому у меня есть мой код выкладывается так:Путаница над файлами заголовков

prototypes.h:

#ifndef PROTOTYPES_H 
#define PROTOTYPES_H 

#include "constants.h" 
#include "globals.h" 
#include "functions.h" 

struct circle 
{ 
    float x; 
    float y; 
    int r; 
}; 
//other class declarations 
#endif PROTOTYPES_H 

functions.h:

#ifndef FUNCTIONS_H 
#define FUNCTIONS_H 

#include "SDL_header.h" 
#include "prototypes.h" 

bool check_collision(circle circle, SDL_Rect rect); 
//other function declarations 

#endif FUNCTIONS_H 

который, насколько я могу сказать совершенно правильно, по крайней мере, в соответствии с this информация. Даже когда я нажимаю «круг» в файле functions.h в среде IDE, я получаю правильную подсказку «struct circle». Однако, когда я компилирую, я получаю ошибку «необъявленный идентификатор« круг »по отношению к функциям.h ...

какой ад ..?

+0

Использование в роскошь '#pragma once' –

ответ

1

В настоящее время у вас есть круговое включение. Prototype.h включает functions.h и functions.h включает prototype.h

Теперь, если файл cpp, который вы компилируете, вызывает prototype.h, во второй строке будет содержаться содержимое функций.h, которое поместит ссылку на круг до его фактического определения.

В вашем случае, если функции.h включают функции на структурах, определенных в prototype.h, не должно быть никаких причин, чтобы включил functions.h из prototype.h. Если управлять зависимостями между файлами заголовка ваш код будет гораздо легче управлять ..

В вашем случае:

  • function.h зависит от prototype.h и должен включать его
  • prototype.h не должна включать в себя function.h

Кроме того, это, как правило, стоит держать/структура и все функции класса в один заголовочный файл. Если файл не становится слишком большим, в этом случае вы можете разделить его на несколько заголовков.

ПРИМЕЧАНИЕ: скотина решение сила может быть добавление вперед замедление до STRUCT круга непосредственно перед его использованием в functions.h однако я резервирует такие решения только в тех случаях, когда они на самом деле нельзя избежать

+0

Правильно, спасибо. Сейчас это довольно очевидно, я думаю об этом. Итак, что лучший способ структурирования моей программы, если мне нужны мои классы, чтобы иметь доступ к моим функциям и моим функциям, чтобы иметь доступ к моим классам? – Robomoo

+0

Зачем вам нужен prototype.h, чтобы быть в курсе функции.h? Ничто в prototype.h не зависит от functions.h, поэтому вам не нужно включать include. prototype.h включает 3 файла, но ничего не использует из любого из них. – odedsh

+0

В prototype.h есть другие классы, которые зависят от функций, я сократил файл с целью его публикации. На самом деле, хотя я думаю, что я мог бы включить его в каждый из классов class.cpp вместо этого, чтобы заставить его работать, изначально я просто включил функции.h в prototypes.h, чтобы все мои классы имели доступ к функциям, если им это нужно. – Robomoo

Смежные вопросы