Skocz do zawartości

Blad W Kompilacji - Unsigned References.


porterneon

Rekomendowane odpowiedzi

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

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ę
×
×
  • Dodaj nową pozycję...