C++, constructor aanroepen met door user ingevoerde naam

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • timberleek
  • Registratie: Juli 2009
  • Laatst online: 08-09 22:13
hallo

Ik ben bezig met een soort banksysteem (schoolopdracht). Nu is er een klasse account waarin (logisch) de accounts worden aangemaakt en lidfuncties zijn gedeclareerd enzo (niet belangrijk verder)

in de klasse bank is er vervolgens de lidfunctie CreateAccount. Die vraagt aan de gebruiker een gebruikersnaam en dan wordt er een account gecreëerd door de constructor van account aan te roepen.
alleen moet je de constructor een naam meegeven. in de trant van:
Account japie (variabelen);

alleen zou ik de naam (japie in het voorbeeld) variabel willen maken naar het rekeningnummer. nu kun je een naam niet beginnen met een getal dus wil ik er iets van maken als nr0, nr1, nr2 etc.

maar je kan niet zomaar een variable als naam meegeven:
string accountNaam = "nr1";
Account accountNaam (variabelen)

Maar is er een andere manier om dit te doen?
er moet toch een manier zijn lijkt me...

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 21:30

Sebazzz

3dp

Een array meegeven? (en in het geval van C++ ook de lengte van de array)
Een vector meegeven kan natuurlijk ook, zelfs nog beter vaak.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
Ik zou werkelijk waar niet weten waarom je dit zou willen cq. van belang is?

[ Voor 13% gewijzigd door Jaap-Jan op 12-12-2010 22:12 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • timberleek
  • Registratie: Juli 2009
  • Laatst online: 08-09 22:13
het is de bedoeling dat het aangemaakte account de naam heeft als nr'rekeningnummer'.
Dat maakt het makkelijk om verderop met de accounts te werken.

dan hoef je niet per account te zoeken naar het juiste rekeningnummer maar kun je rechtstreeks het juiste account 'aanspreken' (het rekeningnummer is bekend bij elke handeling, wordt ingevoerd door de gebruiker).

maar is er een manier om een constructor aan te roepen zonder vaste naam?
dus ipv
Account japie (variabelen);

iets in de trant van.
string accountnaam;
cin >> accountnaam;
account accountnaam (variabelen)


en zodat ik verderop in het programma bij een overschrijving bijvoorbeeld het volgende kan doen:
"overschrijven naar rekeningnummer:"
int rekeningnummer;
cin >> rekeningnummer
string rekening = "nr"+ rekeningnummer (moet anders, dat weet ik)
rekening.stortbedrag(bedrag)

het lijkt me niet dat je bij c++ altijd een naam in de code vastgelegd moet hebben. of zie ik dat verkeerd?

[ Voor 16% gewijzigd door timberleek op 12-12-2010 22:28 ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
Ja, dat zie je verkeerd. C++ kent niet zoiets als 'variabele variabelen', wat je wel kunt doen in PHP:
PHP:
1
2
$account = 'nr012345678';
$$account = new Account(variabelen);

Waarna je dus een nieuwe variabele hebt genaamd 'nr012345678' die een account bevat.

Je kunt de accounts bijvoorbeeld wel opslaan in een std::map met het rekeningnummer als key zodat je hem makkelijk kunt opzoeken.

[ Voor 5% gewijzigd door Jaap-Jan op 12-12-2010 22:41 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Vinnienerd
  • Registratie: Juli 2000
  • Laatst online: 23:29
Wat is het nut hiervan? Je code zelf staat toch niet in de DB?

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou dan gebruik maken van een std::map.

C++:
1
2
3
4
5
6
#include <map>
#include <string>

std::map<std::string, Account *> accounts;

accounts["jaap"] = new Account (parameters);


Dat komt het dichtst in de buurt, denk ik :).

edit:
Verdammt! Jaap-Jan was net iets eerder, toen ik begon met typen was de edit er nog niet xD

[ Voor 18% gewijzigd door Verwijderd op 12-12-2010 22:36 ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
Verwijderd schreef op zondag 12 december 2010 @ 22:36:
(..)

edit:
Verdammt! Jaap-Jan was net iets eerder, toen ik begon met typen was de edit er nog niet xD
Dat stond er ook al voor de edit. Ik had 'japie' veranderd in 'nr012345678' om meer op zijn voorbeeld te lijken. :+

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • timberleek
  • Registratie: Juli 2009
  • Laatst online: 08-09 22:13
ok dan ga ik zoiets proberen.

bedankt voor de hulp

Acties:
  • 0 Henk 'm!

Verwijderd

Jaap-Jan schreef op zondag 12 december 2010 @ 22:39:
[...]
Dat stond er ook al voor de edit. Ik had 'japie' veranderd in 'nr012345678' om meer op zijn voorbeeld te lijken. :+
Dan moet ik gewoon beter lezen :+

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Verwijderd schreef op zondag 12 december 2010 @ 22:36:
Ik zou dan gebruik maken van een std::map.

C++:
1
2
3
4
5
6
#include <map>
#include <string>

std::map<std::string, Account *> accounts;

accounts["jaap"] = new Account (parameters);
Waarom zo ingewikkeld?

C++:
1
2
3
std::map<std::string, Account> accounts;

accounts["jaap"] = Account (parameters);

Die "new Account" is een Java-isme, en niet verstandig in C++.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • Jeanpaul145
  • Registratie: Juli 2007
  • Laatst online: 15-07 14:52
MSalters schreef op dinsdag 14 december 2010 @ 11:31:
[...]

Waarom zo ingewikkeld?

C++:
1
2
3
std::map<std::string, Account> accounts;

accounts["jaap"] = Account (parameters);

Die "new Account" is een Java-isme, en niet verstandig in C++.
Dit soort advies draagt bij aan het oneindige vermaak dat the daily wtf mij biedt :+
De asterisk geeft aan dat je elke std::string naar een pointer naar een Account mapt, in plaats van elke std::string naar een Account zelf te mappen. Afhankelijk van wat je van plan bent is het veel goedkoper qua resources (vnl cpu-time) om met pointers naar objecten te werken.
Klik hier voor wat meer info.

:j


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Je geeft wel informatie over "new", maar niet waarom het in dit geval wel verstandig is om te gebruiken. Als je een simpel lijstje bijhoudt en dat niet met new doet, hoef je je ook geen zorgen te maken over het opruimen van het geheel. Als je wel new gebruikt zul je wel zaken zelf moeten gaan opruimen. Zeker in dit geval denk ik niet dat het performance technisch gezien iets uitmaakt. Maar kan je aangeven wat je precies bedoelt met "goedkoper" en vermaak op the dailywtf? Dit voorkomt namelijk een mooie WTF, het niet opruimen van gealloceerd geheugen ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zou de stelling ook willen omdraaien: afhankelijk van wat je van plan bent is het duurder en meer rompslomp om met pointers te werken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Jeanpaul145
  • Registratie: Juli 2007
  • Laatst online: 15-07 14:52
Creepy schreef op dinsdag 14 december 2010 @ 12:19:
Je geeft wel informatie over "new", maar niet waarom het in dit geval wel verstandig is om te gebruiken. Als je een simpel lijstje bijhoudt en dat niet met new doet, hoef je je ook geen zorgen te maken over het opruimen van het geheel. Als je wel new gebruikt zul je wel zaken zelf moeten gaan opruimen. Zeker in dit geval denk ik niet dat het performance technisch gezien iets uitmaakt. Maar kan je aangeven wat je precies bedoelt met "goedkoper" en vermaak op the dailywtf? Dit voorkomt namelijk een mooie WTF, het niet opruimen van gealloceerd geheugen ;)
Wat je zegt klopt allemaal. Dat je het geheugen moet opruimen met delete als je de new operator gebruikt staat in het wikipedia artikel, en ik zei dan ook "afhankelijk van wat je van plan bent" ;)

De reden dat ik het vergelijk met een tdwtf artikel is omdat er zo ongenuanceerd "Die "new Account" is een Java-isme, en niet verstandig in C++." staat, en dat is dan ook een statement die overduidelijk lang niet altijd opgaat.

[ Voor 12% gewijzigd door Jeanpaul145 op 14-12-2010 12:53 ]

:j


Acties:
  • 0 Henk 'm!

Verwijderd

Als je gebruik maakt van

C++:
1
std::map<std::string, Account *> accounts;


Kan je altijd nog een overgeerfd type van account gebruiken om daarin te stoppen. Dat is een voordeel van met pointers werken. Aangezien het om een bankrekening gebeuren ging, ging ik er een beetje van uit dat je daarin ook verschillende soorten rekeningen kan hebben (zo'n zelfde opdracht heb ik op school ook gehad).

Vandaar dat ik automatisch een asterisk neer zette waarin het in dit geval inderdaad niet heel erg nodig is.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sowieso zou ik het loskoppelen. Je hebt ten eerste een database met Accounts, en ten tweede indices waarmee je snel kunt zoeken. Niet alleen op naam, maar uiteraard ook op rekeningnummer. Derhalve is de storage van een Account geen verantwoordelijkheid voor de map waar je de index mee maakt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • The End
  • Registratie: Maart 2000
  • Laatst online: 21:28

The End

!Beginning

Jeanpaul145 schreef op dinsdag 14 december 2010 @ 12:51:
De reden dat ik het vergelijk met een tdwtf artikel is omdat er zo ongenuanceerd "Die "new Account" is een Java-isme, en niet verstandig in C++." staat, en dat is dan ook een statement die overduidelijk lang niet altijd opgaat.
Toen ik het las dacht ik ook meteen: :? Er zijn tal van redenen om 'new' te gebruiken en heeft echt helemaal niks met 'java-isme' te maken. Ik ben benieuwd waar die gedachte vandaan komt.

Acties:
  • 0 Henk 'm!

Verwijderd

Het voordeel van Account ipv Account * te gebruiken is dat je niet zelf je rommel hoeft op te ruimen. En dat je wellicht een minimale hoeveelheid geheugen bespaard. Verder kan ik zo snel niet op redenen komen op het absoluut niet te gebruiken...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

The End schreef op dinsdag 14 december 2010 @ 13:35:
[...]

Toen ik het las dacht ik ook meteen: :? Er zijn tal van redenen om 'new' te gebruiken en heeft echt helemaal niks met 'java-isme' te maken. Ik ben benieuwd waar die gedachte vandaan komt.
Lekker uit context weer. 'new' is op zich geen java-isme, al je objecten newen en overal pointers gebruiken wél.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • The End
  • Registratie: Maart 2000
  • Laatst online: 21:28

The End

!Beginning

.oisyn schreef op dinsdag 14 december 2010 @ 14:07:
Lekker uit context weer. 'new' is op zich geen java-isme, al je objecten newen en overal pointers gebruiken wél.
De opmerking van MSalters is gewoon fout. Het is een veel te simplistische reactie. Het enige wat hij zei was "Die "new Account" is een Java-isme, en niet verstandig in C++." Welke context is er dan nog meer? Als je zo zegt dat new gebruiken een java-isme is, dan wil ik graag weten waarom, want dan heb ik blijkbaar een belangrijke ontwikkeling in C++ gemist. Dat is niet zo'n gekke vraag hoor.

Wat jij nu aangeeft is dan weer het andere uiterste. Niemand heeft het over al je objecten newen of overal pointers gebruiken.

[ Voor 14% gewijzigd door The End op 14-12-2010 14:43 ]


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ik zou trouwens in dit geval wel degelijk object pointers opslaan. In het geval van bankrekeningen lijkt het me dat je een grote collectie van deze objecten gaat benaderen, heen en weer gooien, doorgeven en deriven.
Tenzij je een soort reference counting & copy-on-write mechanisme implementeert heeft dat mijn insziens toch wel degelijk impact op de performance ?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

The End schreef op dinsdag 14 december 2010 @ 14:42:
[...]

De opmerking van MSalters is gewoon fout.
Er is in z'n geheel niets fout aan de opmerking van MSalters.
Het is een veel te simplistische reactie. Het enige wat hij zei was "Die "new Account" is een Java-isme, en niet verstandig in C++." Welke context is er dan nog meer?
De context was het stukje code waar het om ging. Als jij gewoon sec een account wil hebben en die wilt indexeren op naam, dan is er geen enkele reden om daar een pointer van te maken.
Wat jij nu aangeeft is dan weer het andere uiterste. Niemand heeft het over al je objecten newen of overal pointers gebruiken.
Als je hier zonder verdere redenen een dergelijke keuze maakt dan doe je dat natuurlijk overal, duh.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

.oisyn schreef op dinsdag 14 december 2010 @ 15:22:
[...]

Er is in z'n geheel niets fout aan de opmerking van MSalters.
Maar is wel heel erg kort door de bocht en is makkelijk verkeerd op te vatten
[...]

De context was het stukje code waar het om ging. Als jij gewoon sec een account wil hebben en die wilt indexeren op naam, dan is er geen enkele reden om daar een pointer van te maken.
De use case bepalen op een kleine code snippet is anders ook niet de juiste manier. het stukje code zegt niets over het verder gebruik van Accounts.
[...]

Als je hier zonder verdere redenen een dergelijke keuze maakt dan doe je dat natuurlijk overal, duh.
?? Als je nu kiest voor het niet gebruiken van pointers doe je dat overal in je programma ??

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

EddoH schreef op dinsdag 14 december 2010 @ 15:43:
[...]


Maar is wel heel erg kort door de bocht en is makkelijk verkeerd op te vatten
Daar ben ik het dan weer helemaal mee eens ;). Maar er wordt nu net gedaan alsof de tendens die veel java'ers (en programmeurs van vergelijkbare talen natuurlijk) hebben als ze C++ programmeren niet bestaat. En dit is een klassiek voorbeeld van een dergelijke tendens. Of het ook zo is, dat is aan het kleine stukje natuurlijk niet te zien.
?? Als je nu kiest voor het niet gebruiken van pointers doe je dat overal in je programma ??
Dat zei ik niet. Ik zei: als je in dit geval, zonder verdere redenen, kiest voor pointers, dan doe je dat natuurlijk overal zonder verdere redenen

[ Voor 22% gewijzigd door .oisyn op 14-12-2010 15:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

.oisyn schreef op dinsdag 14 december 2010 @ 15:45:
[...]

Daar ben ik het dan weer helemaal mee eens ;). Maar er wordt nu net gedaan alsof de tendens die veel java'ers (en programmeurs van vergelijkbare talen natuurlijk) hebben als ze C++ programmeren niet bestaat. En dit is een klassiek voorbeeld van een dergelijke tendens. Of het ook zo is, dat is aan het kleine stukje natuurlijk niet te zien.
Eensch. :)
Maar ik vind het ook overdreven om bij een snippet waar 'new' aangedragen wordt, zonder enige info over het verdere gebruik en de exacte context, het gelijk te bespempelen alsa java'isme dat afgeraden wordt in C++.Het is een perfect valide stuk C++ code.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:35
The End schreef op dinsdag 14 december 2010 @ 14:42:
[...]

De opmerking van MSalters is gewoon fout. Het is een veel te simplistische reactie. Het enige wat hij zei was "Die "new Account" is een Java-isme, en niet verstandig in C++." Welke context is er dan nog meer? Als je zo zegt dat new gebruiken een java-isme is, dan wil ik graag weten waarom, want dan heb ik blijkbaar een belangrijke ontwikkeling in C++ gemist. Dat is niet zo'n gekke vraag hoor.

Wat jij nu aangeeft is dan weer het andere uiterste. Niemand heeft het over al je objecten newen of overal pointers gebruiken.
Als je het in de context plaatst dan zegt hij dus ook niet 'new' is verkeerd zoals jij suggereert; hij zegt 'pointers in een lijst plaatsen is een Java-isme en in C++ niet verstandig (als het niet hoeft)'

* farlane = slow

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • The End
  • Registratie: Maart 2000
  • Laatst online: 21:28

The End

!Beginning

.oisyn schreef op dinsdag 14 december 2010 @ 15:45:
Dat zei ik niet. Ik zei: als je in dit geval, zonder verdere redenen, kiest voor pointers, dan doe je dat natuurlijk overal zonder verdere redenen
Dat is toch ook een hele simpele conclusie?
farlane schreef op dinsdag 14 december 2010 @ 15:59:
Als je het in de context plaatst dan zegt hij dus ook niet 'new' is verkeerd zoals jij suggereert; hij zegt 'pointers in een lijst plaatsen is een Java-isme en in C++ niet verstandig (als het niet hoeft)'

* farlane = slow
En dat 'als het niet hoeft' moet nou juist niet tussen haakjes. Daar draait het om. Dat maakt het verschil tussen een kloppende en een verwarrende opmerking. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Je kan het er toch gewoon een rekeningNummer veld aan meegeven. In de trend van
account.rekeningNummer;
Je bereikt op die manier hetzelfde.

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
Maar je kan dan geen account opzoeken aan de hand van een rekeningnummer.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Gorion3
  • Registratie: Februari 2005
  • Laatst online: 24-08 08:28

Gorion3

ABC++

ja dat kan wel, alleen moet je dan wat "lastiger" doen met een loop en die dan het veld "rekeningNummer" gaat vergelijken met het jouw opgegeven rekening nummer..

Awesomenauts! Swords & Soldiers


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Met andere woorden, niet aan te raden voor een banksysteem met potentieel miljoenen rekeningen ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1