Hirdetés

Keresés

Új hozzászólás Aktív témák

  • dobragab

    addikt

    válasz EQMontoya #3686 üzenetére

    Klasszikus értelemben vett hibát egyet sem. Olyat viszont, ami a költő hozzá nem értéséről tanúskodik, többet is.

    - Az osztály elnevezése. Ha kommentben kell jelezni, hogy ez bizony XMLParsingException, tessék már úgy is nevezni az osztályt. Bár ahogy nézem, itt az osztálynevek módosítva vannak, nem hiszem, hogy az XML-t kiszedted volna belőle.

    - std::string-et érték szerint átvenni a konstruktorban. Elvileg nem baj, sok esetben érdemes így csinálni C++11 óta, ha ugyanis a BaseException-nek van std::string&&-es konstruktora, egy füst alatt csinálhatsz string-et másoló és mozgató konstruktort, ha az inicializáló listán ezt írod: BaseException{std::move(error_)}.

    Mivel pl. az std::runtime_error-nak nincs ilyen konstruktora, és az egész kódból sugárzik, hogy C++98-ban írták, így erős a gyanúm, hogy itt csak egy felesleges másolást látunk. Plusz sose szerencsés, ha exception dobása közben dobódik egy másik a másolásnál, mert pl. elfogyott a memória. Ezt viszont nem lehet teljesen kikerülni.

    - Kézzel forward-olni a konstruktort, mint az állatok. Ráadásul rosszul, lásd előző pont. C++11 óta illik így írni:
    using BaseException::BaseException;

    - Copy ctor kézzel, mint az állatok. Ha valami magic-et csinál ott, még elfogadható, de akkor az op=-nél is illene, meg amúgy is minek. Ez egy sima kivétel-osztály, az ilyen szarság csak hibalehetőség.

    - Virtuális destruktor a leszármazottban. Feltételezem, csak azért csinálta, hogy a destruktort virtuálisnak deklarálja, annak meg így semmi értelme, azt az ősben kellett. Ha a destruktora nem üres, komoly indok kell az egészhez, de attól még lehet jó.

    - throw(). Már a C++98 szabványosítás körül kiderült, hogy a throw(...) deklaráció szar, elavult, nincs értelme, csak ront a helyzeten. 2016-ban még "karban tartják" ezt a kódot, és ilyen van benne. A throw() ráadásul inkompatibilis a noexcept-tel, tehát ha tényleg rögzíteni és vizsgálni kell, hogy egy függvény dobhat-e, ez a kifejezés false lesz.
    if(noexcept(e::~ParsingException())) // ...

    - Kivételdobásról nyilatkozni destruktorban. Egyrészt ha konstruktorban bármi dobódik, az std::terminate. Másrészt, ha throw deklaráció sérül, az is std::terminate, tehát a destruktornál pontosan ugyanaz történik, akármit nyilatkozik ott. Még ha noexcept-et ír, az is ugyanazt jelenti, mintha semmit nem ír oda.

    - Az egysoros tagfüggvények definícióját kiviszi másik forrásfájlba. Ugyan már, kinek fáj, ha inline? Feltételezem, egyikben történik semmi eget rengető, tehát egyrészt a nagy semmiért egy egész függvényhívás lesz (pl. a destruktornál). Másrészt az olvasót baszogatja a tudat, hogy meg kéne nézni, mi van a cpp fájlban, pedig sejti, hogy valószínűleg semmi különös, amiért érdemes lenne megmozdítani az ujját.

    Szóval röviden ennyi. Nálam így nézne ki ez az osztály:

    struct XMLParsingException : public BaseException
    {
    using BaseException::BaseException;
    };

Új hozzászólás Aktív témák