Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Struktura plików nagłówkowych

Ostatnio zmodyfikowano 2016-08-04 14:03
Autor Wiadomość
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
C/C++
//plik: main.cpp
#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() ) { //główna pętla programu
        sf::Event event; //deklaracja zmiennej o nazwie 'event' odpowiadającej za pobieranie eventów
        while( window.pollEvent( event ) ) { //wykrywanie eventów
            if( event.type == sf::Event::Closed ) window.close(); //zamknij okno jeśli użytkownik wywoła zamykanie okna
           
        }
       
        window.clear(); //czyszczenie okna przed rysowaniem
       
        /* tutaj wszystko co ma być rysowane */
        CheckGameState(); //funkcja sprawdzająca status gry i uruchamiająca poszczególne funkcje rysowania
       
        window.display(); //aktualizacja okna po rysowaniu
       
    }
   
    return EXIT_SUCCESS;
}

C/C++
//plik: Game.hpp
#ifndef Game_hpp
#define Game_hpp
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include "Menu.hpp"

enum GameState {
    LOADING_MAIN_MENU, // 0
    MAIN_MENU // 1
};
GameState gamestate;

#endif /* end of include guard: Game_hpp */

C/C++
//plik Menu.cpp
#include "Menu.hpp"

void LoadMainMenu() {
    sf::Font UbuntuR;
    if( UbuntuR.loadFromFile( "fonts/Ubuntu-R.ttf" ) ) std::cout << "Załadowano!";
   
    gamestate = MAIN_MENU;
}

C/C++
//plik: Menu.hpp
#ifndef Menu_hpp
#define Menu_hpp
#include "Game.hpp"

void LoadMainMenu();

#endif /* end of include guard: Menu_hpp */


Kompilator: GNU GCC (g++) pod Linuxem

Z góry dzięki! :)
P-150543
carlosmay
» 2016-08-03 23:41:01
Pomyśl: możesz dodawać je szeregowo (nie muszą być równolegle).
C/C++
// plik menu.cpp
#include "menu.hpp"

// plik Game.hpp
#include "menu.hpp"

// plik Game.cpp
#include "Game.hpp"

// plik main()
#inlcude "Game.hpp"
P-150544
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;
               ^
P-150545
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.
P-150546
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.
P-150547
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.
P-150548
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 :)
P-150549
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ć.
P-150552
« 1 » 2 3
  Strona 1 z 3 Następna strona