[Allegro5] Biblioteka Header-Only
Ostatnio zmodyfikowano 2010-03-13 22:12
steckel Temat założony przez niniejszego użytkownika |
[Allegro5] Biblioteka Header-Only » 2010-03-13 16:54:20 Witam! Napisałem sobie bibliotekę (chyba Header-Only) na podstawie Allegro5. Wszystkie jej pliki wyglądają mniej więcej tak: #ifndef TIMER_HPP #define TIMER_HPP
class Timer { };
#endif
Gdy w projekcie piszę plik z clasą w ten sposób: #ifndef BOHATER_HPP #define BOHATER_HPP
class Bohater { public: Timer czas; Bohater() { czas = Timer( 1 ); } }; To wszystko pięknie działa. Natomiast jeżeli plik rozdzielę na 2: #ifndef BOHATER_HPP #define BOHATER_HPP
class Bohater { public: Timer czas; Bohater() { czas = Timer( 1 ); } }; #include "bohater.h" Bohater::Bohater() { czas = Timer( 1 ); }
To projekt się nie chce skompilować i wyskakują błędy: loh.h(5) : error C2146: syntax error : missing ';' before identifier 'czas' loh.h(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int loh.h(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int loh.cpp(4) : error C2065: 'czas' : undeclared identifier 1>c:\documents and settings\user\moje dokumenty\visual studio 2008\projects\zabawaloh.cpp(4) : error C3861: 'Timer': identifier not found
Potrzebuję rozbić plik na części aby zastosować Forward declaration. Istnieje jakiś sprytny sposób na załatwienie tego problemu, czy będę musiał przerabiać całą bibliotekę, żeby każdy plik był podzielony na h i cpp? |
|
Elaine |
» 2010-03-13 17:35:16 Pokaż kod. Ten prawdziwy. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2010-03-13 18:09:50 To jest paczka z moją biblioteką i projektem: paczka. Nie chciałem jej tu wklejać, bo jest tego sporo. Nie wszystkie pliki tej biblioteki są wg powyższego schematu (header-only), ale te testowane owszem. |
|
Elaine |
» 2010-03-13 18:17:16 Kompilator nie jest jasnowidzem, jeśli mu nie powiesz o istnieniu jakiegoś symbolu, to nie będzie go znał. Przy kompilacji loh.cpp widzi coś takiego: class Loh { Timer t; Loh(); };
Loh::Loh() { t = Timer( 50 ); } Pytanie za 666 groszy: skąd kompilator ma wiedzieć, co to Timer? Rozwiązanie: jeśli header od czegoś zależy, to dołącz w nim wszystko, co jest potrzebne. Bez tego będziesz miał wesołe błędy typu ten wyżej. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2010-03-13 18:48:28 Ale gdy plik nagłówkowy wygląda tak: #ifndef LOH_HPP #define LOH_HPP
class Loh { Timer t; Loh() { t = Timer( 50 ); } };
#endif
i nie ma pliku źródłowego o tej samej nazwie to wszystko pięknie działa. |
|
Elaine |
» 2010-03-13 19:15:51 Bo widocznie w innym pliku źródłowym kolejność #include'ów jest taka, że kompilator widzi wszystko, co mu jest potrzebne. Czysty przypadek. Jak coś zmienisz, to wszystko może się posypać, więc lepiej to jednak popraw. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2010-03-13 19:21:43 więc lepiej to jednak popraw. Masz na myśli przerobienie tej biblioteki, żeby już nie była header-only, czy tylko ten projekt? |
|
Elaine |
» 2010-03-13 19:26:50 Rozwiązanie: jeśli header od czegoś zależy, to dołącz w nim wszystko, co jest potrzebne. Bez tego będziesz miał wesołe błędy typu ten wyżej. |
|
|
« 1 » 2 |