Portál AbcLinuxu, 30. dubna 2025 14:00
- Exceptions in constructor don’t unwind the constructor itself
- Does not even clean up local variables!
- Must do own cleanup
- OTOH: no other way to return failure, constructors are void
Od pitomostí typu, že napíšu prasácký kód, který se nedá číst (což jde v jakémkoli jazyce)To neni pravda, v brainfucku to nejde.
Neobjektovost jako výhoda? Chápu, že ne každý ocení výhodu objektového programování, ale jak může být možnost používat objekty nevýhodou?
{ SomeStructure a; SomeStructureInit(&a); SomeStructureDoSomething(&a); SomeStructureDestroy(&a); }C++ varianta:
{ SomeStructure a; a.doSomething(); }C++ varianta pro lepsi kontrolu:
{ SomeStructure a; a.init(); a.doSomething(); a.destroy(); }Vygenerovany kod prekladacem bude totozny. Obe C++ varianty jsou jednoznacne prehlednejsi, z kodu mizi zbytecne prefixovani funkci, ktere dela kod spis necitelnym.
/usr/include/python2.4/object.h
je krásně čitelný. Sdílené atributy objektů vytvářené pomocí #define PyObject_HEAD
, polymorfismus přes ukazatel na struct _typeobject
. Všechny výhody C++ lze mít C také, a to bez problémů které C++ přináší, ergo C++ žádné výhody nemá. Vy opravdu expanzi makra uvnitř struct
-u považujete za orgie? Vaše manželka se pravděpodobně dosti nudí. 1) Proč se domníváte že řádek kódu, který obsahuje VÍCE informací, je méně čitelný?Protože neobsahuje VÍCE informací
To prefixování v C++ nemizí, v globálních symbolech zůstává, pouze se podobně jako komunista v epicentru jaderného výbuchu proměňuje na paprsky gamma a škodí dálPokud Vám to tak vadí, tak ty metody můžou být inline a odkazovat na extern "C" funkce (třeba pro volání z asm kódu). Reaguji pozdě,,,já vím:)
není objektové
Což je právě ta vada
Jinak s C++ teď začínám. Na jednu stranu je to zajímavé, ale na druhou stranu psát v Javě je mnohem příjemnější.
C++ překladač sice (úmyslně) není Turing-complete.A Zeme je placata. Neumyslne.
?
- C preprocessor umi smycky (cykly).
$ cat factorial.h #if (N <= 1) 1 #else N * #define N2 (N-1) #undef N #define N N2 #include "factorial.h" #endifCPP má lazy expanzi maker, takže na 6. řádku se do N2 uloží vždy stejný výraz, N se neexpanduje. Možná je na to nějaký hack, jak si expanzi v #define řádku vynutit, ale neznám ho.
// tohle je obechcavka, nevim presne na co #define CAT(a, b) a##b #define COND_0 a #define COND_1 b #define COND CAT(COND_, RIDICI) //pouziti: #define RIDICI 0 COND // melo by byt a #define RIDICI 1 COND // ted zas bMyslim, ze cykly by sly nejak podobne, ale uz tohle ukazuje jak se da v preprocesoru programovat. Pokud by vas to vic zajimalo, doporucuju zdrojaky z Boost preprocessor library, je to pekny poctenicko
error: #include nested too deeply
. U gcc
je limit natvrdo po 200 zanořeních (právě vyzkoušeno).
3) Nojo, v tomhle máte pravdu. Jenže Pentium může adresovat paměti (externí) kolik chce, kdežto C++ zdroják může templaty nořit jen jak mu překladač dovolí.
ja problem vidim tam, ze po operaci prirazeni nemate zarucene, co je v obou objektech, aniz byste vedel co je v trideCo? Jak nemám zaručené?
operatory bitoveho posunu jsou naraz operatory vstupu a vystupNejsou. To, že to tak nějaká konkrétní třída dělá, to je jiná věc. A navíc mi neříkejte, že vás to opravdu mate - tohle je věc jasná na první pohled.
neco << 5;Kdo by dělal něco takového, když by šlo o bitový posun? Tam by přece vždycky bylo přiřazení nebo
<<=
.
a = b
vite, co bude v obou objektech... aniz byste vedel jak je operator deklarovany ve tride. btw. ona je jeste sranda, ze v nekterem pripade (ted presne si nevzpominam kterem) se pouzije kopirovaci konstruktor... ale kdyz se vam takovy jazyk libi... dobre vam tak...
operatory bitoveho posunu jsou naraz operatory vstupu a vystup. Nejsou. To, že to tak nějaká konkrétní třída dělá, to je jiná věc. tak jsou nebo nejsou? s takovou tu budeme cyklit jeste dlouho. btw. dokaze me nekdo vysvetlit, proc se nepouzivaji normalni metody, jako v jinych jazycih?
assign(a, b);
, a.assign(b);
, a = b.clone();
, nebo a = clone b;
to jasne je?
const
. A na všetko ostatné tu zas isté múdre hlavy vymysleli dokumentáciu.
nerikejte ze po provedeni a = b vite, co bude v obou objektech... aniz byste vedel jak je operator deklarovany ve tride.Co je to za blbou úvahu - tak snad mám rozum a vím, co dělám. Hodnota objektu b by neměla být ovlivněna a podle nějaké logiky se dá vydedukovat, že bude hodnota z b okopírována do a. To už se vás můžu ptát, jestli víte, co udělá tohle:
a.write(b)A jakou záruku, že to udělá skutečně to, co chcete, máte bez prozkoumání zdrojáku té metody?
tak jsou nebo nejsou? s takovou tu budeme cyklit jeste dlouho. btw. dokaze me nekdo vysvetlit, proc se nepouzivaji normalni metody, jako v jinych jazycih?Smím se zeptat, jak dobře C++ znáte? Jestli vám osobně vadí <<, tak klidně použijte nějaký .write(). Snad každý operátor se dá přetížit k jakémukoliv účelu. Zda << na číslech funguje jako bitový posun je naprosto irelevantní - hlavně že není problém chápat, co to udělá u té konkrétní třídy.
Přesně tak. To už bychom za chvíli mohli tvrdit, že je C++ špatně navržený jazyk, protože nám dovolí napsat
inline void add_one(int& x) { x--; }
Jen je pak otázka, který jazyk je pak navržený dobře…
add_one(x) -> x - 1.
badarith
). Vy jste ho nezkompiloval a nevyzkoušel. Co to na mě zkoušíte?
Ale zkousel jsem si to zkompilovat. Jenze se mi pri kopirovani do formulare nekde cestou ponizila X. Pardon.
Nicmene, pokud mi neco neuniklo, tak pointa tohoto vlakne je, ze nemuzete nabyt naproste jistoty co se ve skutecnosti bude dit pouze ze jmena operatoru, ale ani funkce nebo metody. A erlang tento problem neresi.
a = b;tak si nikdy nemůžu být jistý, že v
b
je na konci to samé jako na začátku. Což je v principu stejný problém jako když napíšub = 1; a = add_one(b);a v b není jednička. To je pak radost takový kód číst. V erlangu můžu napsat
B = (foo, [bar, baz, (1,2,3)], foofoo), A = any_fuckin_function(B)a mám vždy jistotu, že v
B
je stále (foo, [bar, baz, (1,2,3)], foofoo)
aniž bych se do té funkce musel podívat.
const
?
Reference je vlastne ukazatel a je logicke, ze muze funkce menit jeho obsah. I to const se da obejit a nekdy je to nutne, ale to uz neni chyba jazyka.
const
je úplně v jiné části kódu, v úplně jiném souboru a kdo ví co ještě a jak sám píšete, dá se to obejít. Takže nejen, že se musím kouknout kdo ví kam, ale dokonce mi ani nestačí přečíst si definici funkce, ale dokonce musím analyzovat její kód, jestli to náhodou někdo neobchází. Fakt moc príma. No a krom toho s každou novou verzí, abych to dělal znova a znova, protože to prostě jde. Taková blbost. Koho to jen mohlo jen napadnout umožnit modifikovat parametry funkce, nebo obsah reference ... int b = 1; int a = add_one ( (const int) b);v prípade, že neverím funkcii add_one ? (dtto s priradením) ?
to je to isté, ako viacnásobné dedenie. robí problémy, málokto ho používa, a kto tomu nerozumie, ten ma názor davu.
a čo takTo mám psát pokaždé znova a znova? To je fakt řešení, nemám si rovnou dát nohu za krk?int b = 1; int a = add_one ( (const int) b);v prípade, že neverím funkcii add_one ? (dtto s priradením) ?
samozrejme, že nie. V C++ by jeden použil šablóny, v C makrá.
#define add_one_wrapper(b) (add_one ( (const int) b))ale nevravíme každý o tom istom. Toto je riešenie situácie, keď človek neverí
add_one
a ani nič o nej nevie. Normálni programátori ale podľa mňa to slovíčko const
vkladajú do deklarácie funkcií/metód zo slušnosti hneď.
Uf. No jestli je pointou toto, tak nechapu proc do toho Deda Jablko na zacatku zamotal operator= a proc vy jste se chytil zrovna na referencich. Odstratenim zadneho z obou prvku sveho vysneneho cile nedosahnete.
Ale k podstatnejsi vec: pokud vam na c++ vadi tohle, tak jste tragickym zpusobem nepochopil za jakym ucelem byl navrzen, k cemu je urcen a jaka je jeho filozofie. Ze si s c++ muzete ustrelite nohu raz dva, to vam nikdo nevyvraci, zalezi jen na vas, jestli napr. vsechny parametry vsech funkci budete brat referenci, uvnitr je sestkrat "precastujete" a nahodne v nich invertujete nekolik bitu. Existuji lide, kteri jsou takovemu nutkani schopni odolat a v tomhle smeru nemaji s c++ zadny problem.
Podobnym stezovanim se pak radite k trotlum, kteri se navazeji do lispu kvuli zavorkam, makrum (jak neprehledne a matouci!) a funkcionalnimu programovani (== nema objekty!!!), nebo do erlangu, ze ma dementni syntaxi, nema normalni promenne, pouziva posilani zprav (proto zakonite musi byt 1000krat pomalejsi nez jakykoliv ne-zpravy posilajici, ne-vsechno kopirujici jazyk), ... urcite to znate. Vy jste stejny, akorat sedite o dva zakopy vedle.
... ne-vsechno kopirujici jazyk ...Netušíte jak to funguje.
Jak se v Lispu udělá obdoba DNU? Tedy vlastně úplné zapouzdření.
a.write(b)
nema zadne defaultni chovani, proto cloveka nevydesi, kdyz to nekdo implementuje po svem...
c++ znam myslim si, ze dobre, abych vedel, ze je to jazyk, ktery nevi co chce... (stejne jako c# 3.0) ... proste se kolem C naskladala hromada featur bez ladu a skladu a hlubsi koncepce... c++ vam dava dostatecne dlouhe lano a delejte si s nim co chcete... klidne se na nem muzete obesit...
obrat a.write(b) nema zadne defaultni chovani, proto cloveka nevydesi, kdyz to nekdo implementuje po svem...Zdá se mi to, nebo vám doopravdy vadí, že vám jazyk umožňuje udělat něco po svém?
c++ vam dava dostatecne dlouhe lano a delejte si s nim co chcete... klidne se na nem muzete obesit...A to mi na něm přesně vyhovuje. Nepořebuju, aby mi autoři jazyka diktovali, jak mám něco dělat - to vím sám.
c++ vam dava dostatecne dlouhe lano a delejte si s nim co chcete... klidne se na nem muzete obesit...
Podle mých zkušeností jazyky, které vám nedají dost lana na oběšení, vám nedají dost lana ani na spoustu užitečných činností, takže mám raději ty, které mi ho dají dost na oboje a způsob použití nechají na mém uvážení. A to se netýká jen jazyků, ale třeba i operačních systémů. A to říkám jako člověk, který si před pár hodinami spílal do hlav skopových poté, co v příkazu 'init q
' místo kvéčka ze zvyku napsal jedničku… :-)
boost::spirito.i. i pekný príklad zmysluplného overloadovania operátorov
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.