Klasy i kompilacja programu z Symfonii C++

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 :)

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.

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.

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

0

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

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.

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.

0

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

0

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

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.

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ć).

0

Dobra, dzięki za pomoc, zrobiłem jak radziłeś i działa :D Póki co zostaje przy geany i już wszystko wiem. Dzięki programerry !

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