Chyták pro C++ programátora

Petr B.

Re: Chyták pro C++ programátora
« Odpověď #30 kdy: 02. 11. 2010, 11:49:55 »
Pokud ale napíšu

Kód: [Vybrat]
int *a = 0;
int &b = *a;

Pak program nespatne, ale vytvořím referenci na proměnnou int na adrese 0. On rozdíl mezi referencí a pointer není žádný, jde jen o syntaxtický zápis. Ale má určitý význam, a o tom to je.

Aha, konečně mi to došlo :)  Měl bych si zopakovat reference  ::)


Poke

Re: Chyták pro C++ programátora
« Odpověď #31 kdy: 04. 11. 2010, 22:08:15 »
Ale no tak, to by se prece mohlo stat kazdemu. Nema cenu z toho delat vedu. Co to fixnout treba takhle:
if(!builder.getUnMarshaledData())

Zadne NULL viz. Virius: Pasti propasti C++
ani ==0, vedouci na zbytecnou komparaci v kodu.

Kdyz trvate na porovnani, zacnete pouzivat sablonove nullptr s existujicim konverznim operatorem pouze na ukazatel http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf,
nebo si pockejte az ho bude gcc 4.6 umet nativne jako soucasti C++0x.

Poke aka pety.

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Chyták pro C++ programátora
« Odpověď #32 kdy: 05. 11. 2010, 11:31:02 »
Nepochopil :-D
1)
Kód: [Vybrat]
if(!builder.getUnMarshaledData())
Nemá smysl. Ledaže by teda ta třída měla definován operátor !, ale to by to zas spadlo.

2) Je úplně jedno, jestli == null, ==0 nebo !, vzhledem k tomu, že je to smyslově ekvivalentní, tak je to čistě akademická debata (jediný o něco lepší řešení je ten nullptr).

3) Zopakuj si, co je to reference a jak se má používat. Pokud Ti to přijde jako normální, pracovat na jednom kódu s Tebou bych fakt nechtěl.  :o

poke

Re: Chyták pro C++ programátora
« Odpověď #33 kdy: 08. 11. 2010, 17:52:22 »
Ver ze pochopil. :-D

Je v obecne slusnosti definovat operator!. viz cele STL.
Prave to spadnuti je spravne, na chybu se prijde hned. Nejhorsi jsou chyby ktere se projevi az pozdeji.

A vsimnete si, ze jsem nikoho v prispevku nenapadl, ani se vytahoval, viz. egoless programming.

Poke aka pety.

ondra.novacisko.cz

Re: Chyták pro C++ programátora
« Odpověď #34 kdy: 08. 11. 2010, 20:42:27 »
Ale no tak, to by se prece mohlo stat kazdemu. Nema cenu z toho delat vedu. Co to fixnout treba takhle:
if(!builder.getUnMarshaledData())

Zadne NULL viz. Virius: Pasti propasti C++
ani ==0, vedouci na zbytecnou komparaci v kodu.
 pety.
¨

Tak asi by to šlo, kdyby ten operator! byl definován takto
Kód: [Vybrat]
bool Value::operator !() const {return this == 0;} //nebo !this

On je problém ten, že funkce vrací referenci a strčit před to vykřičník znamená volání operatoru! nad výsledkem. Kdyby vracela ukazatel, tak by to vaše samozřejmě prošlo. Jinak testovat v metodě objektu this na nulu je také dobrá prasárna, přesto se k tomu někdy také uchyluji, zvlašť tam, kde je zvýšený riziko toho, že tak nastane. Lze to ale jen u nevirtuálních metod. Třeba při procházení stromu, když jsem línej místo testu na 0 u každého ukazatel na podstrom testovat this na nulu, protože to pak umožňuje mít root stromu roven nule a před procházením už netestovat stav tohoto ukazatele (prázdný strom). Ale jinak nedoporučuju.


Co se samotného testu na 0 nebo na NULL, tak viděl jste někdy výsledný kód?
Kód: [Vybrat]
              or ecx, ecx
              je IsNull
:             ....
IsNull:      .....


Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Chyták pro C++ programátora
« Odpověď #35 kdy: 08. 11. 2010, 23:01:56 »
Jenže evidentně ten kdo to "spáchal", tak nechtěl, aby to spadlo, ale chtěl zneužít vrácení referencí.
Ono to co napsal není chyba ve smyslu, že by to dělalo něco jiného, než by chtěl, nebo že by to padalo. Ona je to "jen" prasečina. 

Co se týče operátoru !, tak tam mě předběh ondra. Jo, šlo by to tak, ale je to prasečina. A navíc - u některejch objektů má ! smysl (ale pouze u některejch) a tam by se to tlouklo významem.
. A hlavně, mimo spešl hodně dobře odůvodněnejch a okomentovanejch případů by nikdy nemělo nastat, že this==0, takže smysl toho operátoru nechápu. I v tom procházení stromu je imho daleko lepší varianta mít strom s hlavou.
A už vůbec nevím, kdes vzal, že v STL je všude definován operátor not. Co vím, tak kontejnery ho právě nemaj (aspoň ta implementace, co jsem používal). Ono, jakej by měl smysl?


Co se týče ==0 tak je to hezkej assemblerovskej hack, ale co jsem zkoušel, tak používá instrukci test, která narozdíl od or neukládá výsledek.

PS: Jinak za invektivu se poke, omlouvám :-) co se jí týče, máš recht :-)