C++ -ban hogyan lehet olyan függvényt írni, ami több pl.4 változónak ad vissza értéket, viszont a függvény hívásakor nem kötelező megadni minden paramétert?
Pl.
Van ez a függvény:
int fuggveny (int &a,int b, string c, int& d, int& e, bool& f)
Én pedig így szeretném hívni:
fuggveny (x,y);
függvény (x,y,z,e);
Tehát ne legyen kötelező megadni minden elemet...
Előre is köszönöm a segítséget!
Hát, azért elég sok API függvény van, ami igen csak meghaladja a három paramétert.
A hihetőségért pl. [link]
Én úgy vagyok vele, hogy attól mert bonyolult még nem lesz rossz. Akkor lesz rossz, ha pazarol.
Inkább legyen egy bonyolutabb kód, mint össze-vissza mutogató kis sorok.
Egyébként is mindent kommentelek és direkt használok definíciókat.
Persze, ez egy natív Windows API függvény, a Clean Code meg igazából egy OOP design könyv.
"Pontosabban egy multifunkciós függvényhez kellett volna a dolog"
Na állj.. multifunkciós függvény? Picit alapoznod kéne szerintem.
"Az overload alatt mit kell értenem? Tudom, hogy vannak a túlterhelt konstruktorok, de biztos nem erre gondoltál csak hasonló elvre, vagy erre?"
Overloadolni függvényt lehet, erre rá kellene keresni ("c++ overload"). Továbbra is javaslom az alapozást.
"Én úgy vagyok vele, hogy attól mert bonyolult még nem lesz rossz. Akkor lesz rossz, ha pazarol."
Ajaj. Fordítva ülsz a lovon :)
"Inkább legyen egy bonyolutabb kód, mint össze-vissza mutogató kis sorok."
Ezt nem igazán értem, fejtsd ki bővebben (a bonyolult általában rossz).
"Egyébként is mindent kommentelek"
A kommentelés akár jó is lehet, de sokszor felesleges, vagy azt jelzi, hogy valami rosszul van írva (ha jól lenne, minek a komment, ugye).
A komment arra van, hogy más is tudja használni és fejleszteni a programot. Nem hülyeség egyáltalán.
A multifunkciós tényleg nem a legjobb szó. De a lekérdezéshez nem fogok 10 függvényt csinálni. Vagy 80x leírni ugyanazt a kódot 80 if utasítással (jobb esetben switch).
Az overload azért nem jó, mert akkor megint sok függvény csinálja ugyanazt.
Bár az adat bekérést külön választhatnám esetleg, ami meghívja a másik lekérdezés függvényt.
Csak ez is olyan eröltetettnek tűnik. Bár holnap megnézem. De amikor például csak a képernyőre írnék, akkor a képernyős függvény milyen adatokkal hívná meg a másik példányát, ha egyszer az nem akar adatokat kapni, mert csak a képernyőre ír?
Próbálgatok tanulni könyvekből és netes anyagból, videóból.
Nem vagyok az a teljesen kezdő programozó (akinek minden új), tehát értem az alapokat. (bár valójában annak számítok, főleg a nyelv miatt). Nem minden 1 másodperc alatt akarok tudni és van türelmem.
Ezért is, ha hülyeséget beszélek az overloadról, akkor megköszönöm, ha valaki megmutatja, hogy gondolta annak a megvalósítását, amit írtam.
Az eddigiekhez:
Egyszerű típusokat nem érdemes konstans referenciával paraméterként átadni, gyorsabb másolni őket, mint referenciát képezni. Ez nem vonatkozik az objektumokra.
Megoldás:
Létezik olyan hogy default paraméter, ezek a paraméter szignatúra végéről indulnak és nem kell híváskor megadni őket. pl:
void function(int a, int b = 0);
Nyilván a te esetedben kedves kérdező a referenciák miatt ez nem megoldás. Roppant egyszerű módon meg lehet ezt oldani, mutatókkal adod át a paramétereket. A függvény törzsben ezeket teszteled és csak akkor adsz neki értéket ha nem nullptr-ek. Ez egy csunya megoldás.
Pro megoldás:
Kicsit komolyabb ha csinálsz egy osztályt. Nem feltétlenül kell class elég egy struct (hiszen minden adattagja public alapból), ezt arra használod hogy a paramétereket összefogod egy halmazba. Itt további előny, hogy minden értéknek adhatsz kezdő (initial) értéket a konstruktorban. Ezt a konténer objektumot kitöltöd és vele hívod a függvényt. Ez a módszer kicsit hasonlót a descriptor tervezési mintára.
Lássunk egy példát:
// Descriptor struktúra
struct FuncDesc
{
int a,b,d,e;
std::string c;
bool f;
FuncDesc(int a, int ,b) { /*Itt lehet nekik értéket adni */ }
};
// Függvény definíció
int function(FuncDesc& desc) { ... }
// Pédahívás
FuncDesc desc(x, y);
desc.c = e;
desc.d = z;
int ret = function(desc);
További előnye, hogy a szoftver fejlesztése során az ilyen függvények és megoldások tipikusan több paramétert is használhatnak majd idővel. Ezt átlátható módon tudod bővíteni minimális "impact"-al, azaz nem kell 10 helyen szétbarmolni a kódodat hozzá.
Ezenkívül pedig a konstruktor része nagy előnyöket biztosít, például a kötelező paramétereket itt tudod megadni, vagy ellenőrzött módon tudsz több konstruktort biztosítani.
Ezer köszönet, megpróbálom értelmezni:)
Habár most gondolkodtam és lehet marad egy olyan verzió, hogy átadok egy struktúrát minden paraméterrel (mit kívánunk csinálni), + lesz benne egy vektor, aminek az elemeit a függvény bővíti az adott másik vektorban lévő classre fognak mutat.
Lekérdezésnél, törlésnél, módosításnál, pedig meg tudom állapítnai, hogy melyik ellemmel kell csinálni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!