Delphi OOP- Osztály Konstruktorának memóriafoglalása?
2014-02-21T18:30:04+01:00
2014-02-22T12:03:18+01:00
2022-06-29T07:55:23+02:00
  • Én ezt máshogy fogalmaznám...
    Nem a konstruktor foglal területet.

    Ez igaz a C++-ra, de Delphiben nincs new kulcsszó. Csak ennyit írsz:

    var valami: TValami; ... valami := TValami.Create;
    (Bár a Delphi a C++-szal ellentétben rád bízza a konstruktor elnevezését, szóval nem feltétlenül Create-nek fogják hívni a TValami konstruktorát.)

    Szóval inkább ne keverjük ide más nyelvek mechanizmusait, amíg a kérdező az OOP alapjaival ismerkedik.
    Mutasd a teljes hozzászólást!
  • "A konstruktor az új példány adattagjainak foglal memóriát"


    Én ezt máshogy fogalmaznám...
    Nem a konstruktor foglal területet.

    Mivel én C++ irányból gondolkodom, de a Delphi is ugyanaz, csak másként néz ki. így ez alapján:

    A 'new' foglalja le a memóriaterületet, a kulcsszót követő típusnak megfelelően, az osztály adattartalmának megfelelő méretű memóriaterület. Pont mint a C malloc() egy strukturára. Nem 'okosabb' vagy 'több'.

    Aztán a típusnevet követő paraméterlista alapján kiválasztja a megfelelő konstruktor függvényt és azt meghívja a már lefoglalt, inicializált (kinullázott illetve megfelelő alapértékekkel feltöltött) memóriaterülettel, mint self/this paraméter.

    A konstruktor valójában csak a már létező self/this adatcsomag módosítását végzi el.
    Mutasd a teljes hozzászólást!
  • Köszönöm a választ Csaboka2!

    Ezek szerint amikor használni akarom más osztály eljárását akkor ha egyéb okok-tényezők nem követelik meg, azaz elfogadott hogy nem hozunk létre objektumot az osztályból hanem Konstruktor nélkül meghívjuk az eljárást...
    Igen, azt tapasztaltam hogy konstruktor nélkül is megtudom hívni az eljárást,
    csak nem voltam benne biztos, hogy ez így helyes. És abban sem voltam biztos, hogy a lefoglalt területek automatikusan felszabadulnak majd.

    Elsősorban a meghívásra és a memória foglalásra voltam kíváncsi, és erre választ kaptam. Még sok mindent össze kell raknom az OOP-vel kapcsolatban. De ezek a "sötét foltok" remélem előbb-utóbb eltűnnek és egyszer összeáll a teljes kép.

    Köszönöm még1x a gyors segítséget!
    Mutasd a teljes hozzászólást!
  • Ha egy másik osztálynak valamelyik eljárását akarom használni, akkor is meg kell hívni az osztály konstruktorát?

    Ha egy metódus nem class metódus (nincs "class" módosító a deklarációjában), akkor mindig egy példányon kell futnia, ezt a példányt pedig a metódus törzsén belül Self néven tudja elérni. Ha nem példányon hívnád meg, nem tudna mit elérni, amikor a Self-re hivatkozik.

    Nyilván nem kell minden metódushíváshoz új példányt létrehozni, sőt, jól megírt kódban csak azért nem szokás létrehozni egy objektumot, hogy aztán csak egy metódust hívjunk meg rajta. (Néha előfordulhat, de nem ez az általános.) Ha egy metódus nem fér hozzá a Self-hez, és nem hív rajta más metódust, akkor az nem is igazán való metódusnak, hanem vagy class metódus, vagy mezei eljárás/függvény kellett volna, hogy legyen.

    Amikor meghívjuk egy osztály konstruktorát, az valójában mennyi változónak foglalja le a helyet a memóriában?

    A konstruktor az új példány adattagjainak foglal memóriát (illetve egyéb szolgáltatások nyújtása végett kicsit több memóriát foglal, mint ami az adattagoknak kell). A metódusok lokális változói a metódus meghívásakor kerülnek lefoglalásra, és a metódusból való kilépéskor szabadulnak fel. Igazából ezekből több is létezhet egy időben, mivel több szálról meg lehet hívni ugyanannak az objektumnak ugyanazt a metódusát, illetve egy metódus meghívhatja saját magát rekurzívan, és akkor is több példányban lesznek jelen a lokális változói.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Kezdő vagyok és most ismerkedem delphi-ben az OOP-vel!
    Felmerült bennem egy kérdés (több is:) és gondolom indítok egy témát amiben
    néhány dolgot kivesézhetnénk. Ha valakinek van kedve és ideje válaszolni azt
    szívesen "meghallgatnám" a témával kapcsolatban.
    Szóval kezdésnek egy régi programomat megpróbálom átírni az OOP szemléletnek megfelelően.

    Csináltam egy másik Unitban egy külön osztályt, amelyben elhelyeztem a használni kívánt eljárásaimat függvényeimet!

    Kérdések:
    1. Ha egy másik osztálynak valamelyik eljárását akarom használni, akkor is meg kell hívni az osztály konstruktorát?

    2. Amikor meghívjuk egy osztály konstruktorát, az valójában mennyi változónak foglalja le a helyet a memóriában? Arra gondolok, hogy ugye van több eljárás és függvény is az osztályban és ezekhez tartoznak különböző változók is amit csak egy adott függvény vagy eljárás használ. És ha én csak az "a"eljárást akarom használni az osztályból, akkor ugye nekem csak az "a"eljárás változóinak a tárolására van szükségem a memóriában a többire nem. Szóval a kérdés, a konstruktor meghívásakor vajon lefoglalja az összes függvény-eljárás változóinak a helyét a memóriában, vagy csak az éppen meghívott függvény változóinak foglalja le a helyet? Vagy esetleg ez attól függ hogy hol deklarálom a változókat? Arra gondolok, hogy az implementáció előtt feltüntetett változókat mind létrehozza, amik pedig magában az eljárásban vannak deklarálva azokat csak akkor amikor éppen használja. Vagy valami ilyesmi!

    Még így az elején lehet hogy teljesen hülyeséget írok, nézzétek el nekem.
    Várom az építőjellegű hozzászólásokat!
    Mutasd a teljes hozzászólást!
abcd