Struktura plików nagłówkowych
Ostatnio zmodyfikowano 2016-08-04 14:03
2dpcpl Temat założony przez niniejszego użytkownika |
Struktura plików nagłówkowych » 2016-08-03 23:18:49 Witam, mam pytanie odnośnie http://cpp0x.pl/kursy/Kurs-C++/Dzielenie-kodu-na-kilka-plikow-zrodlowych/310. Wszystko fajnie opisane w momencie kiedy mamy 2 pliki źródłowe i 1 nagłówkowy. W momencie jednak kiedy dodaję 2gi plik nagłówkowy i 3ci źródłowy pojawia się problem. Mam plik main.cpp który odwołuje się do Game.hpp i do menu.hpp. Menu.cpp odwołuje się natomiast do Menu.hpp oraz powinien się odwołać do Game.hpp. Jeśli jednak w pliku Menu.hpp lub Menu.cpp umieszczę #include "Game.hpp" to kompilator wyrzuca błąd multiple definition of a jeśli nie dodam tego #include to mam błąd cośtam was not declared in this scope Czy tutaj występuje jakaś hierarchia? Jak powinienem to zrobić, aby działała całość? @edit dodaję kod z plików #include "Game.hpp"
void CheckGameState() { switch( gamestate ) { case LOADING_MAIN_MENU: LoadMainMenu(); break; case MAIN_MENU: break; } }
int main() { sf::RenderWindow window; window.create( sf::VideoMode( 1280, 720 ), "test" ); gamestate = LOADING_MAIN_MENU; while( window.isOpen() ) { sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) window.close(); } window.clear(); CheckGameState(); window.display(); } return EXIT_SUCCESS; }
#ifndef Game_hpp #define Game_hpp #include <SFML/Graphics.hpp> #include <string> #include <iostream> #include "Menu.hpp"
enum GameState { LOADING_MAIN_MENU, MAIN_MENU }; GameState gamestate;
#endif
#include "Menu.hpp"
void LoadMainMenu() { sf::Font UbuntuR; if( UbuntuR.loadFromFile( "fonts/Ubuntu-R.ttf" ) ) std::cout << "Załadowano!"; gamestate = MAIN_MENU; }
#ifndef Menu_hpp #define Menu_hpp #include "Game.hpp"
void LoadMainMenu();
#endif
Kompilator: GNU GCC (g++) pod Linuxem Z góry dzięki! :) |
|
carlosmay |
» 2016-08-03 23:41:01 Pomyśl: możesz dodawać je szeregowo (nie muszą być równolegle). #include "menu.hpp"
#include "menu.hpp"
#include "Game.hpp"
#inlcude "Game.hpp"
|
|
2dpcpl Temat założony przez niniejszego użytkownika |
» 2016-08-03 23:43:27 Mam tak szeregowo jak napisałeś, nadal mam błąd kompilacji. Dokładnie taki: Menu.cpp: In function ‘void LoadMainMenu()’: Menu.cpp:4:3: error: ‘sf’ has not been declared sf::Font UbuntuR; ^ Menu.cpp:5:6: error: ‘UbuntuR’ was not declared in this scope if(UbuntuR.loadFromFile("fonts/Ubuntu-R.ttf")) std::cout<<"Załadowano!"; ^ Menu.cpp:5:50: error: ‘cout’ is not a member of ‘std’ if(UbuntuR.loadFromFile("fonts/Ubuntu-R.ttf")) std::cout<<"Załadowano!"; ^ Menu.cpp:6:3: error: ‘gamestate’ was not declared in this scope gamestate = MAIN_MENU; ^ Menu.cpp:6:15: error: ‘MAIN_MENU’ was not declared in this scope gamestate = MAIN_MENU; ^
|
|
carlosmay |
» 2016-08-03 23:50:13 Includujesz na krzyż między Menu.hpp i Game.hpp. Tak nie możesz, bo kompilator nie określa kolejności dodawania plików. |
|
2dpcpl Temat założony przez niniejszego użytkownika |
» 2016-08-03 23:53:38 To jak bym musiał zrobić, żeby działało? Jeśli usunę jedną z tych deklaracji "na krzyż" to dostaję błąd, że niektóre elementy są nie zadeklarowane. |
|
carlosmay |
» 2016-08-03 23:59:14 Dodawaj nagłówki szeregowo, jeśli taka jest potrzeba i zadbaj aby deklaracja funkcji, struktur itp. była znana przed jej użyciem. |
|
2dpcpl Temat założony przez niniejszego użytkownika |
» 2016-08-04 00:00:32 Czyli niektóre deklaracje musiałbym np. przenieść do wcześniejszego pliku .hpp? Dobrze rozumiem? Jutro to sprawdzę i jeśli coś jeszcze nie będzie działać to napiszę tutaj :) |
|
Gibas11 |
» 2016-08-04 09:16:01 Wywal #include "Game.hpp" z Menu.hpp, zrobiłeś tam zapętlone include (game -> menu -> game ...). Teraz może to nie mieć znaczenia, ale nie pilnując tego możesz się na tym ostro przejechać. |
|
« 1 » 2 3 |