Az intravénás bundáskenyér és a kedvenc ropogós napilap mellé.
Ha van egy C++ programom, amiben van egy osztály, aminek van egy privát egész típusú változója, egy üres paraméterlistájú konstruktora meg egy nem-üres paraméterlistájúja. Majd az utóbbiban meghívom az előbbit, akkor miért van az, hogy.. de minek is beszélek itt, lássuk a kódot!
class Ize {
private:
int a;
public:
Ize(){
a= 20;
}
Ize( int param1){
Ize();
std::cout << a;
}
}
int main(){
Ize i1(3);
// itt ki kene irnia, hogy 20
}
Itt egy
kép az egészről, kicsit több kommenttel.
Másik érdekesség, hogy ugye vannak ilyen dolgok, hogy referencia szerinti paraméter átadás, ami egész okos dolog. Amit nem láttam, csak kevés nyelvben, az a változóra hivatkozás a nevével, de úgy, hogy a nevét dinamikusan állítom elő, nem pedig a szokásos módon, azaz nincs beledrótozva a forráskódba.
PHP-ban van ilyen, hogy
$x = 0; $a = "x"; $$a = 3;, C++-ban illetve C#-ban van-e valami hasonszőrű dolog?
Egyszerű probléma, hogy van harminc változóm, be kéne kérni őket szépen sorjában.
Triviálisan rossz megoldás, hogy harminszor bepötyögöm, hogy "kérem írja be az autó rendszámát", "kérem írja be az autó alvázszámát", "kérem írja be az autó színét" és így tovább..
Trú
OOP megoldás, ha csinálok egy konténer objektumot, aminek mondjuk van egy tömbje, amiben van harminc ilyen adattároló osztályú objektum, amiknek van bekérő metódusa és tudja a saját nevét, meg süt, főz zenél.
Határeset megoldás pointerekkel és/vagy változó változókkal (így hívják azt a fajta konstrukctiót, amit a fentebbi PHP kód illusztrál).
Eltárolom egy tömbbe a változókat. (Oké, de hogyan, miként, milyen módon? Lásd lentebb..)
Vagy a neveiket, mert ismét csak hiánycikk egy olyan lehetőség a C++ / C#-ban, amivel le lehet kérni egy adott változó saját nevét. Ugye milyen kényelmes lenne, ha ki-vagyok(anakin) azt adná vissza, hogy "anakin".
Tehát van egy valamilyen adatszerkezetünk, benne a 40 (igen, a 30 meghízott) változó. Egy ciklussal végigfutunk rajtuk és ..
valtozok = { szin, rendszam, loero, ajtok_szama, sarhanyo, hatsokerek_meghajtas, veszvillogo, spoiler, csomagtartoban_hulla, kesztyutartoban_magnum };
while( e = valtozok.next() ){
ConsoleWrite("Kérem a(z) " + valtozo_neve( e ) + " értékét:");
*e = ConsoleRead();
}
Ilyet konkrétan egyetlen nyelvben sem tudok megvalósítani, ami nem azt jelenti, hogy nincs ilyen, csak nem tudok róla. Vagy tényleg nincs ilyen.
Esetleg még azt lehet kipróbálni, hogyha a tömbbe/listába/akármibe, amibe tároljuk a 42 változónkat, referencia szerint spájzolunk. Ami nem az adott értéket teszi be, hanem csak egy mutatót az eredeti változóra, aminek amúgy az értéke kerülne be. Ezzel talán ki lehet játszani a pointerhasználatot a beolvasásnál (ez a *e rész, ahol a *e jelenti az "e változó értéke" dolgot).
Ez jól hangzik, csak még mindig nem tisztáztuk, hogy a képzeletbeli zsákunkba hogyan pakoltunk bele minden jót.
valtozok = { ... };
Ez egy típus nélküli valami, amiben egyszerűen vannak dolgok. Kár, hogy nem a bölcsészet témakörében bolyongunk, hisz' akkor ilyen apróságokkal nem kéne foglalkoznunk, csak ha még hiányzik 32 000 oldal a doktorinkból... de így jártam.
Gond lehet az is, hogy amiket teszünk bele a zsákunkba, nem mind egyformák, de ilyenkor mindnképpen objektumokról kell már beszélnünk és beolvasó metódusról, hiszen nem tudnánk csak úgy elintézni akkor az értékadást. (A kód pont így nézhetne ki akkor is, mert lehet(ne) definiálni értékadó/másoló operátort.) Ilyenkor egy közös ős osztályból lehet származtatni a különböző adatosztályokat, majd a hiperszónikus adatszerkezetünkben erre a közös ősre tudunk hivatkozni, mint típusra.
AlapAdat* valtozok = { szinObjektum, rendszamObjektum, hullaObjektum, ... };
Ugye ez akár jól is működne a C++-ban, de a C#-ban erős sírás lenne a vége, mert jaj, pointerek és jaj, menedzselt kód és jaj, akkor meg már nem-biztonságosként kell fordítani az egész hóbelevancot..
Tehát ezzel a megközelítéssel, hogy a zsákunkban a különböző objektumokra mutatunk csak, amik rendelkeznek valami hasonlósággal (közös ős), ezért kivitelezhető a dolog..
Mégis legjobban az tetszene, ha lehetne változó referenciákat tárolni, akár különböző típusúakat is egy sima batyuban, le tudnám kérni azt a nevet, amit adtam neki a forráskódban, meg egyéb nyalánkságok.
Azért azt megjegyzem, hogy a név lekérés nem túl hasznos, ha mondjuk a változó neve kocsi_bal_pocok_ize_ketto, akkor ezt nem lehet kiiratni csak úgy a felhasználónak. Ilyenkor egy okos-objektumba' kell beszervezni az adattárolást, adatbekérést. Aminek előnye, hogy egyből tudjuk a bekérésnél helyben ellenőrizni, hogy jó formátumú adatokat kaptunk-e. Meg mikor létrehozzuk, könnyedén nevesíthetjük, és mondjuk mikor kiírásra kerül a sor, egy objektum.nevem() metódushívással lekérhetjük a szépen formázott, tagolt, központozott billogját.
... teljesen kihűlt a pirítós, vagy le se húztam? Csak nincs bedugva, az is meglehet. Vidám vasárnapot mindenkinek erre a szép csütörtökre, megyek és lefekszem :)