Klasy i kompilacja programu z Symfonii C++

Klasy i kompilacja programu z Symfonii C++
xorgx3
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Postów:134
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

Kopiuj
 #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

Kopiuj
 //**********************************************************************
// 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

Kopiuj
#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

Kopiuj
 //**********************************************************************
//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

Kopiuj
 ////////////////////////////////////////////////////////////////////////
//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

Kopiuj
////////////////////////////////////////////////////////////////////////
//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

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

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

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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
R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 11 lat
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.

xorgx3
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Postów:134
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 :

Kopiuj
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
byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
0

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


xorgx3
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Postów:134
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.

R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 11 lat
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.

xorgx3
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Postów:134
0

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

MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:14 dni
  • Lokalizacja:Warszawa
  • Postów:1454
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 :]
xorgx3
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Postów:134
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.

MasterBLB
Było mówić,że siedzisz na linuksie.Jak tak,to skorzystaj z rady Raziego91,dobrze gada à propos Qt Creatora
xorgx3
Jakbyś przeczytał dokładnie pierwszy post to byś wiedział :P
R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 11 lat
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ć).

xorgx3
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Postów:134
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 !

Zobacz pozostały 1 komentarz
xorgx3
Zanim do tego dojdę, to zdążę się wszystkiego nauczyć :P Póki co ogarniam symfonię :D
byku_guzio
hehehe, to zamierzasz kilka lat się tak męczyć?
R9
@byku_guzio: się śmiej, ja pisałem skrypty w bashu do kompilacji i uruchamiania:p
byku_guzio
ja tam odkąd pamiętam prawie zawsze byłem związany z VS ;) No może oprócz początków w jakimś borlandzie (ale to jeszcze czasy win 3.11) i zabawy z ogl w code::blocks ;)
KU
Zamiast Makefile i auto(hell)tools polecam Scons do kompilacji projektów :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.