Kezdőoldal » Számítástechnika » Programozás » C++ -ban hogyan lehet olyan...

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?

Figyelt kérdés

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!



2014. máj. 28. 18:07
1 2
 11/18 A kérdező kommentje:

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.

2014. máj. 29. 00:32
 12/18 anonim ***** válasza:

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).

2014. máj. 29. 01:06
Hasznos számodra ez a válasz?
 13/18 A kérdező kommentje:

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.

2014. máj. 29. 01:16
 14/18 A kérdező kommentje:

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?

2014. máj. 29. 01:36
 15/18 A kérdező kommentje:

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.

2014. máj. 29. 01:50
 16/18 A kérdező kommentje:
Esetleg overload és a null pointeres cuccot együtt még holnap megnézem, mert lehet ùgy jò. Aki pròbált segíteni, annak köszi szen!
2014. máj. 29. 02:35
 17/18 anonim ***** válasza:

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.

2014. máj. 29. 09:03
Hasznos számodra ez a válasz?
 18/18 A kérdező kommentje:

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.

2014. máj. 29. 13:33
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!