Gyakorlati C++

Fórumok

Gyakorlati C++

Hozzászólások

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: http://nkari.uw.hu/ckonyv_errata.php

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:http://www.hup.hu/modules.php?name=Forums&file=viewtopic&t=6509. 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 (http://www.prog.hu/tarsalgo/18260-87/Gyakorlati+C.html).
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?

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. Szánalmas.

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: int 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&)'

És akkor ezek után nézzek bele a könyvbe? Megalol.

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:

1. A letölthető kódodban beleesel egy tipikus hibába: idétlen megjegyzések.

Kiemeltel nehany peldat, amik eredeti kornyezetukben nem feltetlenul "idetlenek". Peldaul a

// a függvény elején példányosítjuk ClassA-t

azert lenyeges, mert a masik fuggvenyben mar ez all:

// ClassA példányosítását elhalasztjuk a használata pillanatáig

Mellesleg ezzel a peldaval pont azt mutatom be, miert erdemes elhalasztani a peldanyositast a tenyleges felhasznalas pillanataig.

#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++?

Valoban utobbi a helyes ut, mint ahogy erre ki is terek a megfelelo fejezetben.

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.

Valoban felesleges, azonban nem oszt, nem szoroz.

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.

Ez a pelda a nevterekrol szol, az adott fejallomany annyira egyszeru, hogy igazan nem lenne sok ertelme n db cpp-be include-olni. :-)

8.1 ez közözködés, de kíváncsi vagyok az indokra:

Sajnos kivancsisagod kielegitetlen marad. ;-)

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

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.

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.

Izlesek es pofonok.

5.11: int main()

VC++6 alatt lefordul, de majd kijavitom.

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

Nalam gond nelkul lefordul.

És akkor ezek után nézzek bele a könyvbe? Megalol.

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"]

5.11: int main()

VC++6 alatt lefordul, de majd kijavitom.

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

Nalam gond nelkul lefordul.

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.

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:

1. A letölthető kódodban beleesel egy tipikus hibába: idétlen megjegyzések.

Kiemeltel nehany peldat, amik eredeti kornyezetukben nem feltetlenul "idetlenek". Peldaul a

// a függvény elején példányosítjuk ClassA-t

azert lenyeges, mert a masik fuggvenyben mar ez all:

// ClassA példányosítását elhalasztjuk a használata pillanatáig

Mellesleg ezzel a peldaval pont azt mutatom be, miert erdemes elhalasztani a peldanyositast a tenyleges felhasznalas pillanataig.

Hm, igazad van.

#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++?

Valoban utobbi a helyes ut, mint ahogy erre ki is terek a megfelelo fejezetben.

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

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

Nalam gond nelkul lefordul.

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:

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:

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

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"]

5.11: int main()

VC++6 alatt lefordul, de majd kijavitom.

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

Nalam gond nelkul lefordul.

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.

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.

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!