porterneon Napisano Styczeń 8, 2007 Zgłoszenie Share Napisano Styczeń 8, 2007 Witam Chcialem skompilowac program w c++. Niestety dostaje blad: g++ -Wall pierwszy.cpp -o pierwszy /tmp/ccscQupr.o: In function `main': pierwszy.cpp:(.text+0xd0): undefined reference to `osoba::zapamietaj(char const*, int)' pierwszy.cpp:(.text+0xee): undefined reference to `osoba::zapamietaj(char const*, int)' pierwszy.cpp:(.text+0x130): undefined reference to `bilet::zapamietaj(char const*, char const*, bilet::rodzaj_pociagu, int)' pierwszy.cpp:(.text+0x13e): undefined reference to `bilet::wypisz()' pierwszy.cpp:(.text+0x16c): undefined reference to `bilet::zapamietaj(char const*, char const*, bilet::rodzaj_pociagu, int)' pierwszy.cpp:(.text+0x17a): undefined reference to `bilet::wypisz()' pierwszy.cpp:(.text+0x1b2): undefined reference to `bilet::wypisz()' pierwszy.cpp:(.text+0x1b7): undefined reference to `funkcja_w_innym_pliku()' collect2: ld returned 1 exit status O co tu chodzi? Czemu kompilator nie widzi dowiazan do funkcji w plikach z klasami? Podaje kod programu. plik pierwszy.cpp Kod: ////////////////////////////////// // plik pierwszy.cpp ////////////////////////////////// #include <iostream> using namespace std; #include "osoba.h" #include "bilet.h" void prezentacja(osoba); void funkcja_w_innym_pliku(); //********************************************* int main() { osoba kompozytor, autor; kompozytor.zapamietaj("Fryderyk Chopin", 36); autor.zapamietaj("Marcel Proust", 34); cout << "\nUzywamy w tym pliku tez klazy 'bilet'\n"; bilet zolty, niebieski; zolty.zapamietaj("Frankfurt", "Paryz", bilet::expres, 1); zolty.wypisz(); niebieski.zapamietaj("Zurich", "Genewa", bilet::przyspieszony); niebieski.wypisz(); niebieski.zmien_rodzaj_pociagu(bilet::pospieszny); cout << "\nPo zmianie tego biletu...\n"; niebieski.wypisz(); funkcja_w_innym_pliku(); } //********************************************** void prezentacja(osoba ktos) { cout << "Mam zaszczyt przedstawic panstwu, \n" "Oto we wlasnej osobie: "; ktos.wypisz(); } //konic pliku pierwszy.cpp // Plik bilet.h #ifndef BILET_H_ #define BILET_H_ //********************************** class bilet { public: enum rodzaj_pociagu { osobowy, przyspieszony, pospieszny, expres }; void zapamietaj(const char * sk, const char * dok, rodzaj_pociagu poc, int kl = 2); void zmien_rodzaj_pociagu(rodzaj_pociagu poc); void wypisz(); private: char skad[80]; char dokad[80]; int klasa; rodzaj_pociagu jaki_pociag; const char * opis_rodzaju(); }; //************************************ inline void bilet::zmien_rodzaj_pociagu(rodzaj_pociagu poc) { jaki_pociag = poc; } #endif /konic pliku // Plik bilet.cpp //************************************* #include "bilet.h" #include <iostream> #include <cstring> using namespace std; //************************************* void bilet::zapamietaj(const char * sk, const char * doc, rodzaj_pociagu poc, int kl) { strcpy(skad, (sk ? sk : "Brak danych")); strcpy(dokad, (doc ? doc : "Brak danych")); jaki_pociag = poc; klasa = kl; } //************************************ void bilet::wypisz() { char kreska[] = "[----------------------------------]\n"; char brzegi[] = "[ ]\r["; cout << kreska << brzegi << " Bilet: " << skad << " --> " << dokad << ", klasa " << klasa << "\n" << brzegi << " na pociag " << opis_rodzaju() << "\n" << kreska; } const char * bilet::opis_rodzaju() { //w kolejnosci typu wyliczeniowego const char *nazwy[] = { "osobowy (lub regionalny)", "przyspieszony", "pospieszny", "InterCity expres" }; return nazwy[jaki_pociag]; // zmiana enum na int } //konic pliku //**************************** // Plik osoba.cpp //**************************** #include "osoba.h" #include <cstring> //**************************** void osoba::zapamietaj(const char* napis, int lata) { strcpy(nazwisko, (napis ? napis : "Anonim")); wiek = lata; } //koniec pliku #ifndef OSOBA_H #define OSOBA_H //********************************** // Plik osoba.h //********************************** #include <iostream> using namespace std; ////////////definicja klasy///////// class osoba { char nazwisko[80]; int wiek; public: void zapamietaj(const char* napis, int lata); void wypisz() { cout << "\t" << nazwisko << ", lat: " << wiek << endl; } }; ////////////koniec definicji klasy/// #endif //konic pliku ////////////////////////////////////// // Plik drugi.cpp ////////////////////////////////////// #include <iostream> using namespace std; #include "bilet.h" //*********************************** void funkcja_w_innym_pliku() { cout << "\nJestesmy w innym pliku programu, \n" "tu tez uzywamy biletow\n"; bilet bialy; bialy.zapamietaj("Kraków", "Tarnów", bilet::osobowy); bialy.wypisz(); cout << "Spieszy nam sie, zamieniamy bilet na taki: " << endl; bilet.zmien_rodzaj_pociagu(bilet::pospieszny); bialy.wypisz(); } //koniec pliku Prosze mi powiedziec dla czego to sie nie kompiluje. Pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
!Ci Napisano Styczeń 9, 2007 Zgłoszenie Share Napisano Styczeń 9, 2007 Poniewaz deklaracji i definicji klasy osoba nie biezesz w ogole pod uwage w procesie kompilacji. Zauwaz, ze znajduja sie one w osobych plikach (osoba.h, osoba.cpp); to samo tyczy sie klasy bilet. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
porterneon Napisano Styczeń 9, 2007 Autor Zgłoszenie Share Napisano Styczeń 9, 2007 Dzieki za podpowiedz. Udalo mi sie do tego dojsc. pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się