- iPhone topik
- Kijelző került a kamerasávra a Xiaomi 17 Pro és 17 Pro Max hátulján
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- One mobilszolgáltatások
- Xiaomi 15 - kicsi telefon nagy energiával
- Milyen okostelefont vegyek?
- Apple iPhone 16 Pro - rutinvizsga
- Apple Watch Ultra - első nekifutás
- Xiaomi 13T és 13T Pro - nincs tétlenkedés
Új hozzászólás Aktív témák
-
jattila48
aktív tag
válasz
choco01 #4060 üzenetére
Ahogy b.kov leírta, k a kölcsönzéseket tároló tömb, ami kolcsonzes * típusú (vagyis kolcsonzes tipusu strukturara mutató pointer). Ez azért pointer, (és nem tömb, de tömbként lesz használva), mert előre nem tudod, hogy hány darab kölcsönzést fog tartalmazni (ezt is fájlból olvasod be a db változóba), tömböt deklarálni pedig csak konstans mérettel lehet. Ha megvan hogy hány darab kölcsönzést tartalmaz a fájl, akkor ekkora méretű tömböt fogsz dinamikusan (new-val) lefoglalni, ami kolcsonzes * típusú pointert ad vissza. Talán az okozza a zavart, hogy nem érted miért kell pointer, ha egyszer tömbbe olvasol be. A C-ben (és C++-ban) pointereket lehet tömbszerű szintaxissal használni (ki lehet indexelni mint a tömb elemet), illetve a tömb neve (indexelés nélkül) a tömb kezdőcímét jelenti. A tömb indexelés tulajdonképpen nem más, mint a kezdőcímhez képest indexszel eltolt pointerre való dereferencia. Tehát tomb ugyanaz, mintha *(tomb+i) -t írnál (ez pedig ugyanaz mint *(i+tomb), ami ugyanaz mint i[tomb]; egy kis nyalánkság a C szintaxisból). Ahogy fent írtam, csak a dinamikus helyfoglalás miatt kell pointer, és nem tömb. Ha azt gondolnád, hogy ilyen módon a pointer és a tömb tulajdonképpen ugyanaz, akkor nem lenne egészen igazad, ugyanis a tömb név (mint a tömb kezdő címe) konstans pointer (fordítás idejű konstans), ezért nem lehet neki értéket adni, és nem lehet a címét képezni, ellentétben a pointer típusú változóval. Elég baj, hogy a C-ben a tömb és pointer fogalma így összemosható, ebből szoktak félreértések (és hibák) adódni. Ennyit a tömbökről.
Hogy miért private ez a tömb (pointer), az pedig azért, mert nem feltétlenül kellene a kölcsönzéseket tömbben tárolni (lehetne pl. lista), ezért az osztályod felhasználója nem kell (nem szabad) hogy tudjon az implementációról, számára elég a publikusan biztosított tagfüggvények ismerete, ami az implementációtól függetlenül mindíg ugyanúgy hívható (ez OOP alapelv).
"De most akkor azt is lehetne írni a feltöltéskor hogykolcsonzes[i].datum
;"
Ebben a sorban nem csináltál semmit, egyszerűen a stackre helyezted akolcsonzes[i].datum
értékét.
"hogyan tehetem a private tagokat elérhetővé más számára?"
Leginkább public tagfüggvények által, magát a private adatszerkezetet nem szokás (hiszen ezért private). Ha feltétlenül elérhetővé akarod tenni, akkor legyen public. Előfordulhat azonban, hogy bizonyos külső (free vagyis nem tfv.-ek) függények számára meg akarod engedni a private/protected adattagok elérését, akkor az osztályod ezeket a fv.-eket friend-ként deklarálja (komplett osztályt is lehet friend-ként deklarálni). A friend deklaráció nem esik a public, private, protected láthatóság hatálya alá, mindegy hová írod. Mindíg az az osztály fogadhat barátjának egy fv.-t (vagy másik osztályt), amelyik ezek számára meg akarja engedni a private tagjainak elérését. Nem fordítva, tehát egy külső fv. nem jelentkezhet be, hogy szeretné az adott osztály private tagjait elérni.
A struktúra és az osztály között összesen az a különbség, hogy a struktúra tagjai default public elérésűek, míg az osztályé default private. Vagyis ha nem írsz ki láthatóságot, akkor ez vonatkozik a tagokra. Más különbség nincs, ettől eltekintve teljesen ugyanúgy használhatók. Szokás szerint, ha csak adattagok vannak, akkor struktúrát használnak, ha tfv.-ek is vannak, akkor osztályt, de ez csak konvenció.u.i.: közben míg írtam a választ dabadab megelőzött, kb. ugyanazt válaszolta.
-
válasz
choco01 #4060 üzenetére
C++-ban a struct meg a class ugyanaz a dolog, két különböző névvel. Az egyetlen különbség a default láthatóság, vagyis ha nem írod ki, hogy public: meg private: (de úgyis kiírod), akkor classnál defaultból minden private, structnál meg minden public. Szóval gyakorlatilag az classt meg a structot lehetne egymás helyett használni (de ne csinálj ilyet, mert csak összezavarsz vele másokat (meg a jövőbeli magadat
)
"meg hogyan tehetem a private tagokat elérhetővé más számára?"
A private pont azért private, hogy ne legyen elérhető más számára
Ha ezt akarod, akkor legyen public, de alapvetően adattagotkat nem jó ötlet publicra rakni, mert akkor mindenki úgy rondít bele, ahogy nem szégyell - inkább legyenek a más osztályok számára érdekes adatok tagfüggvényeken keresztül, mert így egyrészt tudod ellenőrizni az értékadásokat, hogy nem hülyeséget akar-e a másik beleírni, illetve át tudod faragni a belső adatstruktúrát anélkül, hogy emiatt át kellene írni a többi osztályt is.
(A kivétel az, ha tisztán adatokat (függvényeket viszont nem) tartalmazó osztályt kell létrehozni, ott publicra érdemes rakni a tagokat és ezeknél érdemes a struct kulcsszót használni, hogy mindenki elsőre lássa, hogy miről van szó)
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Dell Latitude 7440 -14"FHD+1 IPS - i5-1345U 16GB - 512GB - Win11 - 1 év garancia + Dokkoló + 240W DC
- HIBÁTLAN iPhone 15 Pro 128GB Blue Titanium -1 ÉV GARANCIA - Kártyafüggetlen, MS3500
- ÁRGARANCIA!Épített KomPhone i9 14900KF 32/64GB DDR5 RAM RX 9070 XT 16GB GAMER PC termékbeszámítással
- HIBÁTLAN iPhone 13 mini 128GB Midnight -1 ÉV GARANCIA - Kártyafüggetlen, MS3330
- HP 14 Elitebook 830 G5 FHD IPS i5-8350U 3.6Ghz 16GB 256GB SSD Intel UHD Win11 Pro Dokkoló Garancia
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest