Klasy i kompilacja programu z Symfonii C++

Odpowiedz Nowy wątek
2011-07-29 18:35
0

Witam,

To mój pierwszy post z problemem na tym forum :) Być może problem jest błahy, ale ja kompletnie nie umiem sobie z nim poradzić.

Do rzeczy :

Czytam podręcznik "Symfonia C++ Standard" wyd.2008. Utknąłem na klasach. Dokładnie w podrozdziale 10.12 "Nowa klasa? Osobny plik!".
Przepisałem program (nie bezmyślnie!), ale nie wiem jak go skompilować. Jeśli ktoś nie ma tej książki podaje wszystkie pliki :

osoba.h

 #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

osoba.cpp

 //**********************************************************************
// Plik : osoba.cpp
//**********************************************************************
 
#include "osoba.h"
#include <cstring>
//**********************************************************************
 
void osoba::zapamietaj(const char * napis, int lata)
{
    strcpy(nazwisko, (napis ? napis : "Anonim"));
    wiek = lata;
}

bilet.h

#ifndef BILET_H_
#define BILET_H_
//**********************************************************************
//Plik : bilet.h
//**********************************************************************
 
class bilet
{
    public: 
        enum rodzaj_pociagu { osobowy, przyspieszony, pospieszny, ekspres };
 
        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
 

bilet.cpp

 //**********************************************************************
//Plik: bilet.cpp
//**********************************************************************
#include "bilet.h"
#include <iostream>
using namespace std;
#include <cstring>
 
//**********************************************************************
void bilet::zapamietaj( const char* sk, const char * dok, rodzaj_pociagu poc, int kl)
{
    strcpy( skad, (sk ? sk : "Brak danych"));
    strcpy( dokad, (dok ? dok : "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()
{
    const char *nazwy[] = {
        "osobowy (lub regionalny)",
        "przyspieszony (lekko)",
        "pospieszny",
        "InterCity ekspres"
    };
    return nazwy[jaki_pociag]; //zmiana enum na int
}

pierwszy.cpp

 ////////////////////////////////////////////////////////////////////////
//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);
 
    //wywołujemy funkcje, wysylajac obiekty
    prezentacja(kompozytor);
    prezentacja(autor);
 
    cout << "\nUżywamy w tym pliku też klasy 'bilet'\n";
 
    bilet zolty, niebieski;
    zolty.zapamietaj("Frankfurt", "Paris", bilet::ekspres, 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 przedstawić państwu, \nOto we własnej osobie:";
    ktos.wypisz();
}

drugi.cpp

////////////////////////////////////////////////////////////////////////
//plik drugi.cpp
////////////////////////////////////////////////////////////////////////
#include <iostream>
#include "bilet.h"   // bo w bieżącym pliku używamy klasy bilet
using namespace std;
//**********************************************************************
void funkcja_w_innym_pliku()
{
    cout << "\nJesteśmy w innym pliku programu, \ntu też używamy biletów\n";
    bilet bialy;
    bialy.zapamietaj ("Krakow", "Tarnow", bilet::osobowy);
    bialy.wypisz();
 
    cout << "Spieszy sie nam, zmieniamy bilet na taki:" << endl;
    bialy.zmien_rodzaj_pociagu(bilet::pospieszny);
    bialy.wypisz();
}
 

No i teraz pytanie : jak to skompilować? Każdy plik osobno ? Jak je później "złączyć" w jeden program? W ogóle tego nie pojmuje.

Dodam, że siedzę na Linuksie, piszę w geany oraz

 $ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Mam nadzieję, że znajdzie się ktoś kto mnie oświeci :)

Pozostało 580 znaków

2011-07-29 19:55
0

Kompilujesz program np.: pierwszy.cpp
Kompilator automatycznie doda wymagane pliki (określone poprzez #include) i (jeżeli nie będzie błędów), to program się uruchomi.
Nie trzeba każdego pliku ręcznie.


edytowany 1x, ostatnio: Patryk27, 2011-07-29 19:55

Pozostało 580 znaków

2011-07-30 00:37
0
Patryk27 napisał(a)

Kompilujesz program np.: pierwszy.cpp
Kompilator automatycznie doda wymagane pliki (określone poprzez #include) i (jeżeli nie będzie błędów), to program się uruchomi.
Nie trzeba każdego pliku ręcznie.

To jest C++, nie Java, C# czy tam C++/CLI.

w kompilacji wymieniasz wszystkie pliki .cpp, np. g++ main.cpp osoba.cpp (itd.).

Albo w swoim IDE tworzysz projekt i IDE będzie się tym zajmowało.

Pozostało 580 znaków

2011-08-02 19:49
0

No ok, IDE się tym zajmuje, ALE :
Kiedy kompiluje program pierwszy.cpp wywala mi : "Kompilacja ukończona pomyślnie", ale programu jeszcze nie da się odpalić, więc biorę "buduj" i wtedy wywala mi duuużo błędów :

g++ -Wall -o "pierwszy" "pierwszy.cpp" (w katalogu /home/rlk120/projekty/symfonia_klasy)
/tmp/ccFqGv5u.o: In function `main':
pierwszy.cpp:(.text+0x2c): undefined reference to `osoba::zapamietaj(char const*, int)'
pierwszy.cpp:(.text+0x45): undefined reference to `osoba::zapamietaj(char const*, int)'
pierwszy.cpp:(.text+0x15a): undefined reference to `bilet::zapamietaj(char const*, char const*, bilet::rodzaj_pociagu, int)'
pierwszy.cpp:(.text+0x169): undefined reference to `bilet::wypisz()'
pierwszy.cpp:(.text+0x18d): undefined reference to `bilet::zapamietaj(char const*, char const*, bilet::rodzaj_pociagu, int)'
pierwszy.cpp:(.text+0x19c): undefined reference to `bilet::wypisz()'
pierwszy.cpp:(.text+0x1ce): undefined reference to `bilet::wypisz()'
pierwszy.cpp:(.text+0x1d3): undefined reference to `funkcja_w_innym_pliku()'
collect2: ld returned 1 exit status
Kompilacja nie powiodła się

Proszę o jakąś dalszą pomoc w zrozumieniu tego zjawiska ;P

edytowany 1x, ostatnio: xorgx3, 2011-08-02 19:49

Pozostało 580 znaków

2011-08-02 19:57
0

Musisz mu podać wszystkie pliki cpp. Może ruszy tak: g++ -Wall -o pierwszy *.cpp


Pozostało 580 znaków

2011-08-02 20:07
0

No dobra, poszło, dzięki, teraz pytanie jak to ustawić w Geanym, bo przecież nie będę przy każdej "większej" kompilacji korzystał z konsoli.

Pozostało 580 znaków

2011-08-02 20:20
0

Każde współczesne IDE ma coś takiego jak menedżer projektu, który zarządza plikami projektu. Kompiluje każdy .cpp z osobna, a potem konsoliduje i linkuje to do jednej wykonywalnej binarki.

Po prostu stwórz projekt i w nim dodawaj pliki .cpp . Nie wiem jak to tam w Geany dokładnie wygląda, ale bez stworzonego projektu ani rusz.

Pozostało 580 znaków

2011-08-02 20:26
0

No właśnie robię wszystko w projekcie, ale nie idzie! Nawet jak biorę "kompiluj wszystko" to nie uruchamia się.

Pozostało 580 znaków

2011-08-02 20:53
0

Stary,weź sobie zassij jakie Visual C++ Express 2008,bo herezje opowiadasz,iże się nie daje


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-08-02 20:55
0

Siedzę na Linuchu i już jestem przyzwyczajony do mojego Geany. Chciałbym żeby mi ktoś pomógł w tym IDE, a nie polecał jakieś inne środowiska.

Było mówić,że siedzisz na linuksie.Jak tak,to skorzystaj z rady Raziego91,dobrze gada à propos Qt Creatora - MasterBLB 2011-08-02 21:00
Jakbyś przeczytał dokładnie pierwszy post to byś wiedział :P - xorgx3 2011-08-02 21:04

Pozostało 580 znaków

2011-08-02 20:56
0

Zainstalowałem se Geany i faktycznie ten menedżer projektów niezbyt przyjazny. A Make to kto zrobi?
Można co najwyżej makra zrobić i w ustawieniach komend kompilacji zamiast %f dać .cpp:
`g++ -Wall -o "%e"
.cpp`

Użyj Code::Blocksa, albo Qt Creatora (niby do Qt, ale same IDE jest bardzo dobre i szybkie). Znacznie łatwiej się w nich zarządza projektami (szczególnie Qt Creator z qmake, do którego pliki .pro idzie łatwo ręcznie napisać).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0