Hirdetés

Keresés

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

  • caddie

    csendes tag

    válasz ktg3 #126 üzenetére

    Azt hiszem, hogy a problemak egy reszet mar leirtak, en meg javasolnek 1-2 dologt:

    - nagyon nem illik a headerekbe a using namespace std;-t beleirni
    - a standard konyvtar definial egy vector template osztalyt, majdnem azonos neven
    - a kiiro operator definialasakor te igazabol egy free (''globalis'') fuggvenyt definialsz, amely egyik parametere template osztaly. ebbol kifolyolag az altalad definialt kiiro operatornak is templatenek kell lennie (alatta ki is van kommentezve)
    - konstruktoroknal erdemes hasznalni az inicializalasi listat (ezzel kikerulheto a telejsen felesleges default konstrualas es az ezuatni ertekadas)
    - unsigned int-ek helyett, erdemes hasznalni az STL-hoz hasonloan a size_t tipust
    - ertekado operatorok tipikusan T& ternek vissza a lancbafuzes tamogatasa miatt, de persze lehet, neked pont az volt a celod, hogy ilyen dolgokat ne engedj meg
    - mivel letezik a vektor meretenek lekerdezesere kialakitott interface (size()), ezert velemenyem szerint felesleges a kiiro template operatort friendkent deklaralni
    - a NULL nem szabvanyos! nullat hasznalj helyette
    - a copy konstruktort biztos igy akartad csinalni?


    {
    Vector<int> a;
    // a-t feltoltod elemekkel

    Vector<int>b(a);
    }
    // megsemmisul a, felszabadul a.pData;
    // felszabadul(na) b.pData;
    // de mivel a.pData == b.pData ami mar megsemmisult,
    // ehelyett katasztrofa lesz


    // alternativ eset

    a.clear(); // felszabadul a.pData (b.pData is oda mutat)
    b[5];
    // szerencses esetben elcrachel a programod
    // peches esetben pedig fut tovabb csak hulyeseg irodik ki
    // megpechesebb esetben jo irodik ki
    // klasszikus undefined behaviour



    - copy konstruktor egyertelmuen hibas
    - assert.h helyett majd inkabb cassert-et hasznald
    - erase eseten, ha egy elemed volt akkor -1-re alitod az elemenNum-t
    - postfix increment / decrementalas helyett erdemes a prefixet hasznalni (ahol persze azonos a ketto funkcionalitasa)
    - erase eseteben a torlendo elem kihagyasa nem tul elengas, sott gyanus, hogy a for ciklusnal a ciklusfeltetel tulindexelest fog eredmenyezni
    - insert-nel erdemes lenne const T& -et atadni
    - ennek nem latom sok ertelmet:


    if(elementNum==UINT_MAX)
    {
    return false;
    }


    de ha mar ilyenekre figyelsz, akkor erdemes lenne inkabb a C++ std altal biztositott dolgokat hasznalni, tovabba inkabb a new sikeres memoriafoglalasat ''leellenorizni''* (bar egy beadando eseteben egyiknek sincs tul sok jelentosege)

    * erdemes eszrevenni, hogy alap esetben std::bad_alloc exceptiont dob, de nothrow-os valtozat hasznalataval ra lehet venni arra is, hogy nullpointert adjon vissza sikertelen foglalas eseten


    - insertnel megint az kell, hogy modnjam, hogy ez nem tul elegans modja az elem beszuarasanak
    - insertnel ha pos > mint az aktualis vektor merete, akkor ne egyenkent toltsd fel nullaval, hanem default konstruald nullaval inkabb
    - insertnel nem latom pontosan, hogy miert pos + 1 meretu tombot foglalsz
    - [] operator eseteben az az altalanos STLes megkozelites, hogy [] nem ellenoriz indexhatarokat, csak at teszi azt, igy az at fuggvenyt a [] segitsegevel valositjak meg.
    - eddig sem lattam sok ertelmet az asserteknek, az amlitett dolgok nem olyan hibak amiert le kene shutdownolni az egesz programot, de ertekado operator eseteben egyenesen a jozan esz ellen megy. Abban az esetben inkabb egy return *this; kellene, amennyiben onertekadasrol lenne szo



    Igy elso atfutasra en ezeket a furcsasagokat vettem eszre, nehany kozulok talan csak sznobizmus, de azert akadt kozottuk par tervezesi hiba es eletveszelyes undefined behaviour is.

    [Szerkesztve]

  • Jester01

    veterán

    válasz ktg3 #126 üzenetére

    Ezzel millió baja volt a fordítónak, de azokat javítva valamit csinál.
    Mi a problémád konkrétan?

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