Gyakorlati C++

 ( Carlos | 2005. július 14., csütörtök - 14:04 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Sziasztok!

Ezt a temat azert nyitottam meg, hogy vegre tisztazzam a Gyakorlati C++ cimu konyvem kialakult helyzetet.
Annak idejen elinditottam egy forumot a prog.hu-n, mivel - rendhagyo modon - kivancsi voltam az olvasok reakcioira.

Termeszetesen voltak fanyalgok is, ami rendben is lenne, azonban miutan felvettem a kesztyut es vegulis tisztaztam a felreerteseket, kritikusaim hirtelen kiszalltak a vitabol.
Ez nem nem tul elegans megoldas, olyan, mintha felallnal a sakktabla mellol, amikor vesztesre allsz...

Vegul mindossze 3 hibat, illetve elirast talaltunk. Termeszetesen javitottam oket, ti is megnezhetitek es velemenyt alkothattok a sulyossagukrol: [url]http://nkari.uw.hu/ckonyv_errata.php[/url]

Nagyon zavaro es szamomra erthetetlen, hogy egyesek meg mindig az emlitett prog.hu-s sardobalas vadaira alapoznak, amikor megitelik a konyvemet. Sajnos ez itt is elofordult:[url]http://www.hup.hu/modules.php?name=Forums&file=viewtopic&t=6509[/url]. Szeretnem, ha a konyvemet kritizalok legalabb annyi faradsagot vennenek, hogy belelapozzanak, mielott palcat tornenek felette, es nem kizarolag egy valoszinuleg frusztralt es szakmailag feltekeny kollega velemenyere alapoznanak ([url]http://www.prog.hu/tarsalgo/18260-87/Gyakorlati+C.html[/url]).
Koszonom! ;-)

A könyv nekem megvan, de még csak most kezdtem el olvasgatni, eddig tetszik. A honlappal kapcsolatban viszont lenne egy kérdésem: a "C++ haladóknak" c részben mi az, amit csak az IE tud megjeleníteni?
Nem lehetne esetleg átkonvertálni valamilyen platformfüggetlen(ebb) formátumba?

[quote:73a211d04f="rpsoft"]...a "C++ haladóknak" c részben mi az, amit csak az IE tud megjeleníteni?
Nem lehetne esetleg átkonvertálni valamilyen platformfüggetlen(ebb) formátumba?[/quote:73a211d04f]
Orulok, hogy eddig tetszik a konyv.
Az emlitett oldalt powerpointbol generaltam, es nem ellenoriztem, hogyan jelenik meg kulonbozo bongeszokben. Amint lesz ra idom, atkonvertalom sima HTML-re (idoigenyes munka, mert tele van vezerlokkel).
Kosz az eszrevetelt!

A letölthető kódodban beleesel egy tipikus hibába: idétlen megjegyzések.
(10.3)
...
//Konstruktor
ClassA()
...
//Globális fv.
...
// a függvény elején példányosítjuk ClassA-t

7.3:
#define MAX_ROT numeric_limits<unsigned char>::digits - 1
miért nem const int MAX_ROT =numeric_limits<unsigned char>::digits - 1;
ha már egyszer C++?

7.1:

cout << endl << "x = " << x <<"; y = " << y << endl \
<< "x / y = " << e << "; x % y = " << m << endl;
perjel minek a végén? Az csak stringek esetén szükséges.

6.1 kulso.h
egy változó van definiálva a headerben. Ez hiba. Ha n db cpp-be include-oljuk, akkor n-szer lesz definiálva, és nem lehet összeszerkeszteni.

8.1 ez közözködés, de kíváncsi vagyok az indokra:
const time_t t = time( NULL );
miért nem
const time_t t = time( 0 ); ?

11.2 gondoltam lefordítom:
main.cpp:4:21: negyzet.h: Nincs ilyen fájl vagy könyvtár
main.cpp:5:17: kor.h: Nincs ilyen fájl vagy könyvtár
main.cpp: In function `int main()':
main.cpp:12: error: `Kor' undeclared (first use this function)
main.cpp:12: error: (Each undeclared identifier is reported only once for each
function it appears in.)
main.cpp:12: error: `korPtr' undeclared (first use this function)
main.cpp:12: error: syntax error before `(' token
main.cpp:13: error: `Negyzet' undeclared (first use this function)
main.cpp:13: error: `negyzetPtr' undeclared (first use this function)
main.cpp:13: error: syntax error before `(' token
main.cpp:15: error: `Alakzat' undeclared (first use this function)
main.cpp:15: error: syntax error before `>' token
main.cpp:16: error: `alakzatList' undeclared (first use this function)
main.cpp:20: error: syntax error before `>' token
main.cpp:21: error: `p' undeclared (first use this function)

A fájlok nagybetűsek, kisbetűsen include-oltak. Az alakzat.h-ban két #endif van

Ha ettől eltekintek (kis, nagybetű rendben + egy darab #endif):
panther@zeratul:~/t/tmp/Alakzat> g++ main.cpp
/tmp/ccNmxxnX.o(.gnu.linkonce.t._ZN7NegyzetC1Ef+0xd): In function `Negyzet::Negyzet[in-charge](float)':
main.cpp: undefined reference to `Alakzat::Alakzat[not-in-charge]()'
/tmp/ccNmxxnX.o(.gnu.linkonce.t._ZN3KorC1Ef+0xd): In function `Kor::Kor[in-charge](float)':
main.cpp: undefined reference to `Alakzat::Alakzat[not-in-charge]()'
/tmp/ccNmxxnX.o(.gnu.linkonce.t._ZN7NegyzetD1Ev+0x16): In function `Negyzet::~Negyzet [in-charge]()':
main.cpp: undefined reference to `Alakzat::~Alakzat [not-in-charge]()'
/tmp/ccNmxxnX.o(.gnu.linkonce.t._ZN7NegyzetD0Ev+0x16): In function `Negyzet::~Negyzet [in-charge deleting]()':
main.cpp: undefined reference to `Alakzat::~Alakzat [not-in-charge]()'
/tmp/ccNmxxnX.o(.gnu.linkonce.t._ZN3KorD1Ev+0x16): In function `Kor::~Kor [in-charge]()':
main.cpp: undefined reference to `Alakzat::~Alakzat [not-in-charge]()'
/tmp/ccNmxxnX.o(.gnu.linkonce.t._ZN3KorD0Ev+0x16): In function `Kor::~Kor [in-charge deleting]()':
main.cpp: undefined reference to `Alakzat::~Alakzat [not-in-charge]()'
/tmp/ccNmxxnX.o(.gnu.linkonce.r._ZTI7Negyzet+0x8): undefined reference to `typeinfo for Alakzat'
/tmp/ccNmxxnX.o(.gnu.linkonce.r._ZTI3Kor+0x8): undefined reference to `typeinfo for Alakzat'
collect2: ld returned 1 exit status

Alakzat.h: ha beírok egy üres implementációt a destruktornak, akkor már kevesebb hiba:
/tmp/cc7zYAf0.o(.gnu.linkonce.t._ZN7NegyzetC1Ef+0xd): In function `Negyzet::Negyzet[in-charge](float)':
main.cpp: undefined reference to `Alakzat::Alakzat[not-in-charge]()'
/tmp/cc7zYAf0.o(.gnu.linkonce.t._ZN3KorC1Ef+0xd): In function `Kor::Kor[in-charge](float)':
main.cpp: undefined reference to `Alakzat::Alakzat[not-in-charge]()'
collect2: ld returned 1 exit status

Ha az Alakzat::Alakzat -nak is írok egy üres törzset, akkor lefordul. [i:5e2213eac1]Szánalmas.[/i:5e2213eac1]

11.3: unió ebben a formában gáz. Nem igazán jó példa ez rá. A C++-ban ott van a származtatás pl a származtatás.

5.11: [b:5e2213eac1]int[/b:5e2213eac1] main()
egisterKeyw.cpp:97: error: `main' must return `int'
RegisterKeyw.cpp: In function `int main(...)':
RegisterKeyw.cpp:102: error: return-statement with no value, in function
declared with a non-void return type

11.8
/tmp/cciwl3ZD.o(.text+0x114): In function `main':
min.cpp: undefined reference to `Minimalis::Minimalis[in-charge]()'
/tmp/cciwl3ZD.o(.text+0x15e):min.cpp: undefined reference to `Minimalis::Minimalis[in-charge](Minimalis const&)'
/tmp/cciwl3ZD.o(.text+0x1a8):min.cpp: undefined reference to `Minimalis::operator=(Minimalis const&)'

[i:5e2213eac1]És akkor ezek után nézzek bele a könyvbe? [b:5e2213eac1]Megalol.[/b:5e2213eac1][/i:5e2213eac1]

A példa kódok, ha jól sejtem a Microsoft Visual Studio 6.0 nevű csodával készülhettek.

Ami a következőt is megengedi:
[code:1:77743648a9]
for ( int i=0;i<100;++i)
{
}
std::cout<<i<<std::endl;
[/code:1:77743648a9]
A lokális változó globálissá van téve, legalábbis a fordító szerint.
És ha nincs default construktorod, akkor ő generál egyet. :lol:

Akkor nezzuk csak szep sorban:
[quote:374db2d69f]1. A letölthető kódodban beleesel egy tipikus hibába: idétlen megjegyzések. [/quote:374db2d69f]
Kiemeltel nehany peldat, amik eredeti kornyezetukben nem feltetlenul "idetlenek". Peldaul a
[quote:374db2d69f]// a függvény elején példányosítjuk ClassA-t[/quote:374db2d69f]
azert lenyeges, mert a masik fuggvenyben mar ez all:
[quote:374db2d69f]// ClassA példányosítását elhalasztjuk a használata pillanatáig[/quote:374db2d69f]
Mellesleg ezzel a peldaval pont azt mutatom be, miert erdemes elhalasztani a peldanyositast a tenyleges felhasznalas pillanataig.

[quote:374db2d69f]#define MAX_ROT numeric_limits<unsigned char>::digits - 1
miért nem const int MAX_ROT =numeric_limits<unsigned char>::digits - 1;
ha már egyszer C++? [/quote:374db2d69f]
Valoban utobbi a helyes ut, mint ahogy [b:374db2d69f]erre ki is terek a megfelelo fejezetben[/b:374db2d69f].

[quote:374db2d69f]cout << endl << "x = " << x <<"; y = " << y << endl \
<< "x / y = " << e << "; x % y = " << m << endl;
perjel minek a végén? Az csak stringek esetén szükséges. [/quote:374db2d69f]
Valoban felesleges, azonban nem oszt, nem szoroz.

[quote:374db2d69f]6.1 kulso.h
egy változó van definiálva a headerben. Ez hiba. Ha n db cpp-be include-oljuk, akkor n-szer lesz definiálva, és nem lehet összeszerkeszteni.[/quote:374db2d69f]
Ez a pelda a nevterekrol szol, az adott fejallomany annyira egyszeru, hogy igazan nem lenne sok ertelme [i:374db2d69f]n db cpp-be include-olni[/i:374db2d69f]. :-)

[quote:374db2d69f]8.1 ez közözködés, de kíváncsi vagyok az indokra:[/quote:374db2d69f]
Sajnos kivancsisagod kielegitetlen marad. ;-)

[quote:374db2d69f]11.2 gondoltam lefordítom:
main.cpp:4:21: negyzet.h: Nincs ilyen fájl vagy könyvtár
main.cpp:5:17: kor.h: Nincs ilyen fájl vagy könyvtár [/quote:374db2d69f]
Ami a fajlneveket illeti, a VC++ 6 eseten nincs veluk gond (include fajlnev nem case-sensitive).
Az altalad jelzett forditasi hibak sem fordulnak elo nalam, sajnos gcc-vel nem probaltam ki.

[quote:374db2d69f]11.3: unió ebben a formában gáz. Nem igazán jó példa ez rá. A C++-ban ott van a származtatás pl a származtatás.[/quote:374db2d69f]
Izlesek es pofonok.

[quote:374db2d69f]5.11: int main()[/quote:374db2d69f]
VC++6 alatt lefordul, de majd kijavitom.

[quote:374db2d69f]11.8
/tmp/cciwl3ZD.o(.text+0x15e):min.cpp: undefined reference to `Minimalis::Minimalis[in-charge](Minimalis const&)' [/quote:374db2d69f]
Nalam gond nelkul lefordul.

[quote:374db2d69f]És akkor ezek után nézzek bele a könyvbe? Megalol.[/quote:374db2d69f]
Termeszetesen nem kotelezo (valoszinuleg tul fogom elni 8) ).

13.3.2

[code:1:c82d6c4bde]
while( it_start != list_it )
{
cout << *it_start++ << endl;
}
[/code:1:c82d6c4bde]
Ez igy nagyon jó, csak épp az iterátort így nem célszerű használni

[code:1:c82d6c4bde]

for(list<int>::iterator i=intList.begin();i!=list_it;++i)
{
cou<<*i<<endl;
}
[/code:1:c82d6c4bde]
Szerintem így jobb, átláthatobb és jobban látszik, hogy mire való.
Bár lehet hogy ez csak szeretet kérdése.

[quote:90c29bea83="Carlos"][quote:90c29bea83]5.11: int main()[/quote:90c29bea83]
VC++6 alatt lefordul, de majd kijavitom.

[quote:90c29bea83]11.8
/tmp/cciwl3ZD.o(.text+0x15e):min.cpp: undefined reference to `Minimalis::Minimalis[in-charge](Minimalis const&)' [/quote:90c29bea83]
Nalam gond nelkul lefordul.
[/quote:90c29bea83]

Azért a c++ szabvánt elolvashatnád, ha már könyvet írsz róla.
A vc6 igen távol áll és állt bármiféle c++ szabványtól.
[quote:90c29bea83="Carlos"]
Ami a fajlneveket illeti, a VC++ 6 eseten nincs veluk gond (include fajlnev nem case-sensitive).
Az altalad jelzett forditasi hibak sem fordulnak elo nalam, sajnos gcc-vel nem probaltam ki.
[/quote:90c29bea83]
Itt a hiba nem a fordítóban van, hanem a rendszerben. Windows nem foglalkozik a kis és nagy betükkel, a unix meg igen.
Bár az össze header fájl a c++-ban kisbetűs, hogy ne legyenek ilyen gondok.

[quote:d44fd6ace3="Carlos"]Akkor nezzuk csak szep sorban:
[quote:d44fd6ace3]1. A letölthető kódodban beleesel egy tipikus hibába: idétlen megjegyzések. [/quote:d44fd6ace3]
Kiemeltel nehany peldat, amik eredeti kornyezetukben nem feltetlenul "idetlenek". Peldaul a
[quote:d44fd6ace3]// a függvény elején példányosítjuk ClassA-t[/quote:d44fd6ace3]
azert lenyeges, mert a masik fuggvenyben mar ez all:
[quote:d44fd6ace3]// ClassA példányosítását elhalasztjuk a használata pillanatáig[/quote:d44fd6ace3]
Mellesleg ezzel a peldaval pont azt mutatom be, miert erdemes elhalasztani a peldanyositast a tenyleges felhasznalas pillanataig.
[/quote:d44fd6ace3]

Hm, igazad van.

[quote:d44fd6ace3]
[quote:d44fd6ace3]#define MAX_ROT numeric_limits<unsigned char>::digits - 1
miért nem const int MAX_ROT =numeric_limits<unsigned char>::digits - 1;
ha már egyszer C++? [/quote:d44fd6ace3]
Valoban utobbi a helyes ut, mint ahogy [b:d44fd6ace3]erre ki is terek a megfelelo fejezetben[/b:d44fd6ace3]. [/quote:d44fd6ace3]

Mégis a rossz példát rakod ki a netre.

[quote:d44fd6ace3]
[quote:d44fd6ace3]11.8
/tmp/cciwl3ZD.o(.text+0x15e):min.cpp: undefined reference to `Minimalis::Minimalis[in-charge](Minimalis const&)' [/quote:d44fd6ace3]
Nalam gond nelkul lefordul.
[/quote:d44fd6ace3]
Csak azért fordul le, mert régi a fordítód.

[quote:b2f77e4cb2="ghost"]A példa kódok, ha jól sejtem a Microsoft Visual Studio 6.0 nevű csodával készülhettek.
...
És ha nincs default construktorod, akkor ő generál egyet. :lol:[/quote:b2f77e4cb2]
Utobbi nem a VisualC++ "hibaja", mivel a C++ szabvany szerint is automatikusan letre kell jojjenek az un. specialis fuggvenyek (default constructor, destructor, operator =, operator & ), ha nem adod meg oket. Persze olyanok is... :-)

U.i.
Kulonben a Visual C++ joval az aktualis C++-szabvany elott keszult, ertheto, hogy nem olyan szabvanykoveto, mint a GCC...

[quote:d4044bb13c="Carlos"][quote:d4044bb13c="ghost"]A példa kódok, ha jól sejtem a Microsoft Visual Studio 6.0 nevű csodával készülhettek.
...
És ha nincs default construktorod, akkor ő generál egyet. :lol:[/quote:d4044bb13c]
Utobbi nem a VisualC++ "hibaja", mivel a C++ szabvany szerint is automatikusan letre kell jojjenek az un. specialis fuggvenyek (default constructor, destructor, operator =, operator & ), ha nem adod meg oket. Persze olyanok is... :-)
[/quote:d4044bb13c]

Kevered a dolgokat. Csak akkor és csakis akkor van alapértelmezett implementáció, ha nem deklarálod a függvényt. Te deklaráltad, de definíciót nem írtál hozzá. Ez pl akkor jó, ha a copy konstruktort el akarod rejteni (private), hogy ne lehessen meghívni pl egy singleton esetén. Törzset felsleges írni hozzá. A fordítónak meg eszébe sem jut megtenni ezt.

[quote:21dc24c67d="ghost"][quote:21dc24c67d="Carlos"][quote:21dc24c67d]5.11: int main()[/quote:21dc24c67d]
VC++6 alatt lefordul, de majd kijavitom.

[quote:21dc24c67d]11.8
/tmp/cciwl3ZD.o(.text+0x15e):min.cpp: undefined reference to `Minimalis::Minimalis[in-charge](Minimalis const&)' [/quote:21dc24c67d]
Nalam gond nelkul lefordul.
[/quote:21dc24c67d]

Azért a c++ szabvánt elolvashatnád, ha már könyvet írsz róla.
A vc6 igen távol áll és állt bármiféle c++ szabványtól.
[/quote:21dc24c67d]
Szerintem te is belenezhetnel a szabvanyba. Mint elozo hozzaszolasomban mar irtam, pont a szabvany irja elo a specialis fuggvenyek automatikus letrehozasat, ha a fejleszto kihagyna ezt.

Mellesleg jobb lenne, ha kerulnenk a szemelyeskedest. :!:

[quote:c417499d35="Panther"]
Csak akkor és csakis akkor van alapértelmezett implementáció, ha nem deklarálod a függvényt. Te deklaráltad, de definíciót nem írtál hozzá. Ez pl akkor jó, ha a copy konstruktort el akarod rejteni (private), hogy ne lehessen meghívni pl egy singleton esetén. Törzset felsleges írni hozzá. A fordítónak meg eszébe sem jut megtenni ezt.[/quote:c417499d35]
Valoban ez tortenik, ebben az esetben igazatok van (amugy a constructor elrejtesere is kiterek a konyvben).

Le fogom forditani gcc-vel is a peldaprogramokat, azonban megkoszonnem, ha tovabbra is jeleznetek a problemakat!