steckel Temat założony przez niniejszego użytkownika |
[C++] Problem z podziałem kodu na pliki źródłowe » 2010-03-09 18:07:43 Witam! Mam takie pliki: #include "main.hpp"
int main() { }
#ifndef MAIN_HPP #define MAIN_HPP
#include "definicje.hpp" #include "bohater.hpp"
#endif
#ifndef DEFINICJE_HPP #define DEFINICJE_HPP
enum RASA { ZERG, PROTOSS, TERRAN };
#endif
#ifndef BOHATER_HPP #define BOHATER_HPP
class Bohater { RASA rasa; Bohater(); };
#endif
#include "bohater.hpp"
Bohater::Bohater() { rasa = ZERG; }
Na początku wklejam zawartość Definicje.hpp, a potem Bohater.hpp, który dołącza Bohater.cpp. Problem polega na tym, że ani Bohater.hpp, ani Bohater.cpp nie widzi zawartości Definicje.hpp, która już wcześniej zostałą dołączona. Dlaczego tak się dzieje? ----------------------- malan: Zmieniałem nazwę tematu. |
|
Elaine |
» 2010-03-09 18:14:24 Bo nie dołączasz tego w bohater.hpp? |
|
steckel Temat założony przez niniejszego użytkownika |
» 2010-03-09 18:42:55 Z tego co wiem '#include' wkleja kod(Przynajmniej w PHP tak działa). Więc teoretycznie otrzymujemy taki plik: enum RASA { ZERG, PROTOSS, TERRAN };
class Bohater { RASA rasa; Bohater(); };
Bohater::Bohater() { rasa = ZERG; } int main() { }
Jeśli tak nie jest to powstaje problem, gdy 2 różne klasy są w osobnych plikach i są ze sobą związane. Np: #ifndef GRA_HPP #define GRA_HPP
#include "bohater.hpp"
class Gra { public: int numer; int rasa; void Przypisz( Bohater boh ); };
#endif
#include "gra.hpp"
void Gra::Przypisz( Bohater boh ) { rasa = boh.rasa; }
#ifndef BOHATER_HPP #define BOHATER_HPP
#include "gra.hpp"
class Bohater { public: int rasa; int numer; Bohater(); void Num( Gra gra ); };
#endif
#include "bohater.hpp"
void Bohater::Num( Gra gra ) { numer = gra.numer; }
|
|
Elaine |
» 2010-03-09 18:50:28 Tak. A co się dzieje w bohater.cpp? Po przejściu przez preprocesor zostaje: class Bohater { RASA rasa; Bohater(); };
Bohater::Bohater() { rasa = ZERG; } Skąd kompilator ma wiedzieć, co to RASA i ZERG? Nie zna tych symboli. Przydałoby się mu powiedzieć o tym, co one oznaczają - najlepiej poprzez dołączenie definicje.hpp. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2010-03-09 18:59:28 Zrozumiałem to tak, że kompilator nie wkleja bezpośrednio plików do pliku głównego, tylko najpierw łączy odpowiednie ze sobą i kompiluje, a potem dołącza do kolejnych. Takie jakby drzewo: drzewoDobrze to zrozumiałem? |
|
Elaine |
» 2010-03-09 19:10:02 Źle zrozumiałeś... #include to zwykłe kopiuj-wklej zawartości dołączanego pliku... Po prostu natura C (więc i C++) jest taka, że każdy jeden plik źródłowy trzeba przetwarzać oddzielnie. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2010-03-09 19:20:21 Więc trzeba tak napisać każdy plik (bohater.hpp), aby działał nawet bez pliku, który go wywołuje(main.hpp), żeby te pliki się oddzielnie skompilowały, a następnie złączyły w jedność. Jeśli dobrze zrozumiałem, to dzięki! Pozostaje problem, gdy jedna klasa jest związana z drugą. (wcześniej w tym temacie ten problem poruszyłem. |
|
Elaine |
» 2010-03-09 19:53:56 Forward declaration i używanie (const-)refów czy tam wskaźników zamiast wartości? |
|
« 1 » 2 |