[C++] Classes, Object naar variable noemen?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers.

Ik heb een vraagje over C++.
Kan ik als ik met classes werk zodra ik een nieuwe 'record' in de class aanmaak ik die vernoemen naar een variable?
Een array om precies te zijn?

dus als je een class hebt:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string Namen[3];

Namen[0] = "Jantje";
Namen[1] = "Pietje";
Namen[2] = "Appie";

class Persons{
   // bla bla
}

int main(void){
 // bla bla
 Persons Namen[0];    // hier gaat het dus om
// bla bla 
}


Heb zelf al wat gezocht, maar weet niet goed hoe ik op zoiets zoeken moet.

Bijvoorbaat dank

Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Je wilt dus dat er na regel 13 een variabele is met de naam Jantje? Volgens mij is dat niet mogelijk nee. Dat zou betekenen dat de variabele-namen gedurende run-time bepaald moeten worden, en C++ kan dat enkel gedurende compilatie. Althans, dat geloof ik, correct me if I'm wrong...

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee ik wil dat OP regel 13 de variable naam gebruikt wordt als nieuw 'Persoon'

Acties:
  • 0 Henk 'm!

  • d4nn7
  • Registratie: Mei 2009
  • Laatst online: 15-07 21:37
Wat er naar mijn idee nu gebeurt is dat je een array van Persons objecten maakt, met een lengte van nul. Deze array heet dan 'Namen'.
Met als gevolg dat er twee arrays met die naam zijn: 1 in de global scope (string array) en 1 in de scope van main (Persons).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke, dankje d4nn, maar hoe moet ik het oplossen dan?

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

Jij wil Namen[0] als parameter van Persons meegeven?

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je wil dus stiekem dit doen:

C++:
1
2
3
4
5
int main(void){ 
 // bla bla 
 Persons Jantje;    // hier gaat het dus om 
// bla bla  
}


Dus dat je een variabele maakt die Jantje heet, want Jantje staat in Namen[0]? Dat is niet handig natuurlijk, want hoe weet je later dat Jantje Jantje heet? Dat weet je niet. Dus ga je steeds overal Namen[0] gebruiken.

Dan kun je beter het nieuwe object Persons opslaan in een array. Dus zoiets:

C++:
1
2
3
4
5
6
7
8
9
class Persons {
  // ...
}

int main (void) {
  Persons namen[3];

  // iets doen met namen[0]
}

[ Voor 13% gewijzigd door HuHu op 15-10-2009 19:04 ]


Acties:
  • 0 Henk 'm!

  • Andre-85
  • Registratie: April 2003
  • Niet online

Andre-85

Sid

Je vraag raakt kant noch wal... Bedoel niet iets in deze trant?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person
{
public:
  Person(std::string name) :
  m_name(name)
  {}
private:
  std::string m_name;
}

int main()
{
  std::vector<Person> persons;
  persons.push_back(Person("Jantje");
  persons.push_back(Person("Pietje");
}

Lorem
Whenever we feel the need to comment something, we write a method instead. - Martin Fowler
People who think they know everything really annoy those of us who know we don't - Bjarne Stroustrup


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja eigenlijks wel ja.
Ik wil de inhoud van Namen[0] als 'Naam' van de 'Persoon' meegeven.

Dus in dit geval moet het worden:

C++:
1
Person Jantje

Maar ipv jantje moet hij dat dus dynamisch via de array doen


Edit: wow meerdere posts
@ andre: ik begrijp eigenlijks geen zak van wat je er neer gezet heb xD sorry.
Zo lang ben ik nog niet met c++ bezig om dat allemaal te weten

@huhu
Omdat in m'n eigen code de namen door de user laat in vullen en dan met een for loop voor elk user een nieuwe ... object (?) maken

[ Voor 40% gewijzigd door Verwijderd op 15-10-2009 19:06 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op donderdag 15 oktober 2009 @ 19:03:
Ja eigenlijks wel ja.
Ik wil de inhoud van Namen\[0] als 'Naam' van de 'Persoon' meegeven.

Dus in dit geval moet het worden:

C++:
1
Person Jantje

Maar ipv jantje moet hij dat dus dynamisch via de array doen
Ja, maar dat is stom. Want je weet later nooit dat Jantje Jantje is. Want als iemand je array aanpast kan Jantje opeens Janet heten en dan ben je de weg kwijt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@huhuh lees de edit ;)
Bedankt voor het helpen trouwens mensen!

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 15 oktober 2009 @ 19:03:

Maar ipv jantje moet hij dat dus dynamisch via de array doen
Nee, dat wil je niet. Je wilt eigenlijk gewoon een array of vector of welke collectie dan ook gebruiken om de objecten in op te slaan. Je moet niet iets slechts bedenken en vervolgens gaan uitwerken, je kunt beter leren hoe je wél moet programmeren :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Cheatah:
Ik snap niet helemaal hoe ik dat zou moeten doen met mijn code.
Kan je wat verduidelijken? Ik snap het niet helemaal

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Nou... als je naam nu gewoon onderdeel maakt van de klasse Persons, dan heb je altijd de ingevulde naam bij de hand. Kun je gewoon nummertjes gebruiken als index van je array.

En als je Persons ook nog eens hernoemt naar Person, dan heb je ook precies wat je bedoelt. Want ik ga er vanuit dat die klasse 1 persoon representeert, en geen groep personen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
HuHu schreef op donderdag 15 oktober 2009 @ 19:03:
Je wil dus stiekem dit doen:

C++:
1
2
3
4
5
int main(void){ 
 // bla bla 
 Persons Jantje;    // hier gaat het dus om 
// bla bla  
}


Dus dat je een variabele maakt die Jantje heet, want Jantje staat in Namen[0]? Dat is niet handig natuurlijk, want hoe weet je later dat Jantje Jantje heet? Dat weet je niet. Dus ga je steeds overal Namen[0] gebruiken.

Dan kun je beter het nieuwe object Persons opslaan in een array. Dus zoiets:

C++:
1
2
3
4
5
6
7
8
9
class Persons {
  // ...
}

int main (void) {
  Persons namen\[3];

  // iets doen met namen\[0]
}
Oke,
Dus dan maakt hij voor elke namen[x] die ik toevoeg een nieuw Persoon aan?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op donderdag 15 oktober 2009 @ 19:13:
[...]


Oke,
Dus dan maakt hij voor elke namen[x] die ik toevoeg een nieuw Persoon aan?
Ja :Y. Je hebt dan gewoon een lijst van Personen. Maar de method van Andre-85 is nog beter, met een vector in plaats van een array.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke, dan zal ik even kijken naar vectors, bedankt heren!
Ik zal u op de hoogte houden :)

Acties:
  • 0 Henk 'm!

Verwijderd

Zoiets als Andre-85 laat zien: een naam is gewoon een eigenschap van een persoon. Behandel het dan ook als eigenschap (property).

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op donderdag 15 oktober 2009 @ 19:17:
Oke, dan zal ik even kijken naar vectors, bedankt heren!
Ik zal u op de hoogte houden :)
Alsjeblieft: http://www.cplusplus.com/reference/stl/vector/

offtopic:
Wil je me niet uitschelden voor heer ;).

[ Voor 7% gewijzigd door HuHu op 15-10-2009 19:23 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@huhu edit:
Excuses mevrouw ;) :P
@cheetah:
Volgens mij doe ik dat in mijn script ook wel hoor.

Dan heb ik in class person meegegeven Name (o.a.)

Acties:
  • 0 Henk 'm!

  • Andre-85
  • Registratie: April 2003
  • Niet online

Andre-85

Sid

Nou dat probeer je ;)

Je kan het ook anders benaderen, modeleer eerst. Dan kom je er achter dat je een 'Person' hebt en dat je daar bepaalde eigenschappen van wilt weten zoals: naam, geboorte datum, adres, of wat er ook in je domein belangrijk is. Dat wil je modeleren in een class Person.
Volgende stap is kijken hoe je de data van verschillende personen in een datastructuur krijgt. Je datastructuur kan je ook modeleren. Een method als GetPersonByName() zou daar goed passen.

Ik wil je verder aanraden je nog wat meer te verdiepen in wat een 'class' nou eigenlijk is en hoe je die moet gebruiken. Koop een goed boek :) dat helpt je echt op gang.

[ Voor 7% gewijzigd door Andre-85 op 15-10-2009 19:46 ]

Lorem
Whenever we feel the need to comment something, we write a method instead. - Martin Fowler
People who think they know everything really annoy those of us who know we don't - Bjarne Stroustrup


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Naja, het is meer een introductie voor straks, ik moet straks (over een paar maand) op school beginnen met c++ daarom :)

Maar nu heb ik het volgende:

Ik heb dit:

1) een class genaamd persoon
die class heeft attributen
- Naam
- Geboortedatum
- Adres

Om maar wat geks te noemen.

Wat zou ik nou het beste kunnen gebruiken om een nieuw persoon te benamen?
Zoals ik het nu heb is dat de naam (waar dit hele topic dus op gebaseerd is)
Maar kan ik dat niet beter iets anders doen als een ID ofzo?

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Ik zou eerder zeggen dat de TS een std::map nodig heeft:

C++:
1
2
3
4
5
6
7
class Person { /*****/ };
int main () {
  std::map<std::string, Person> myPersons;
  myPersons["Jantje"] = Person(25, Person::male);
  myPersons["Marietje"] = Person(26, Person::female);
  myPersons["Pietje"] = Person(1, Person::male, son_of(myPersons["Jantje"], myPersons["Marietje"]) );
}

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!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op donderdag 15 oktober 2009 @ 19:52:
Naja, het is meer een introductie voor straks, ik moet straks (over een paar maand) op school beginnen met c++ daarom :)
Dan zou ik gewoon wachten als ik jou was tot je school begint. Veel beter. Nu loop je te kutten en leer je het jezelf misschien wel fout aan. Wacht gewoon en leer het in één keer goed.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, maar ja ik ben dan wel weer zo dat ik dat eerder wil leren :P

Acties:
  • 0 Henk 'm!

  • beany
  • Registratie: Juni 2001
  • Laatst online: 17-09 13:56

beany

Meeheheheheh

HuHu schreef op donderdag 15 oktober 2009 @ 19:58:
[...]

Dan zou ik gewoon wachten als ik jou was tot je school begint. Veel beter. Nu loop je te kutten en leer je het jezelf misschien wel fout aan. Wacht gewoon en leer het in één keer goed.
Niks mis mee om van te voren al wat kennis op te doen.

Misschien is het beste advies in dit geval: pak er eens een boek bij! Er zijn vele C++ boeken te vinden geschreven voor de beginner.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Inderdaad. Hoe ben je het nu aan het leren? Een goed boek zou ik zeker aanraden, dan weet je zeker dat je geen (of weinig) bad practices aanleert.

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
beany schreef op donderdag 15 oktober 2009 @ 21:59:
[...]

Niks mis mee om van te voren al wat kennis op te doen.

Misschien is het beste advies in dit geval: pak er eens een boek bij! Er zijn vele C++ boeken te vinden geschreven voor de beginner.
Wat kennis is ook zeker geen probleem. Maar de problemen waar fakey nu mee zit worden waarschijnlijk al zeer snel verholpen als hij een paar lessen C++ heeft gehad. Dan kan 'ie nu wel klopen klooien, maar voor z'n gemoedsrust lijkt het me dan beter gewoon af te wachten.

Daarnaast heb je nog van die fanatiekelingen die erg ver doordraven en voor het begin van een cursus al vinden "dat ze het al kunnen". Dan blijkt dat ze het al die tijd zichzelf hebben aangeleerd, allerlei stomme dingen doen, daarin blijven volharden en keihard op hun bek gaan.

Als fakey het toch graag wil, dan zou ik 'm aanraden alvast het boek te kopen wat bij je cursus hoort. Dan weet je in ieder geval al zeker dat je het jezelf op de goede manier gaat leren, zoals je het ook in de cursus krijgt.

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
MSalters schreef op donderdag 15 oktober 2009 @ 19:56:
Ik zou eerder zeggen dat de TS een std::map nodig heeft:
Nadeel daarvan is dat als een een Person& hebt, je niet meer bij de naam kunt.

Acties:
  • 0 Henk 'm!

  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
HuHu schreef op donderdag 15 oktober 2009 @ 19:58:
[...]

Dan zou ik gewoon wachten als ik jou was tot je school begint. Veel beter. Nu loop je te kutten en leer je het jezelf misschien wel fout aan. Wacht gewoon en leer het in één keer goed.
Het is in het algemeen toch wel aan te raden om alvast wat zelf te proberen en te experimenteren, maar een goed leerboek of goede voorbeelden is daarbij zeker belangrijk.

Wel grappig om te zien is de totaal kromme gedachtegang van de TS. Hier zie je namelijk het exacte prille begin van de grootste WTF's die je in productie code zo vaak tegen komt. Code waarvoor totaal geen achterliggende logica te bedenken is, maar er toch staat en nog maintained wordt ook omdat niemand meer weet waar het op slaat en het 'voor de zekerheid' maar revisie na revisie mee neemt.

Nou, dergelijke code vindt dus niet zelden haar oorsprong in precies de situatie waarin de TS nu mee bezig is. Gelukkig is TS dan nog wel zo pienter om het even te vragen op een forum ;)

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Olaf van der Spek schreef op zaterdag 17 oktober 2009 @ 15:31:
[...]

Nadeel daarvan is dat als een een Person& hebt, je niet meer bij de naam kunt.
Wellicht wat smerig, maar die Person staat in een pair<string, Person>, dus met wat pointer magic kun je er wel bij. Officieel undefined behaviour (addressof() kun je niet gebruiken want een pair is geen POD), maar in de praktijk gewoon portable :)

[ Voor 16% gewijzigd door .oisyn op 17-10-2009 15:52 ]

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!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Is een set<Person> niet bruikbaar op de een of andere manier (probleem is dat de key const moet zijn)? Pointer magic misbruiken is alleen mogelijk als een Person inderdaad altijd in zo'n map zit.

[ Voor 11% gewijzigd door Olaf van der Spek op 17-10-2009 19:23 ]


Acties:
  • 0 Henk 'm!

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 06:59
Ik vindt een std::map hier niet op z'n plaats. Name hoort naar mijn mening gewoon een attribute van persoon te zijn..

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Dan defineer je een naam in de Person klasse? En declareer je die in de constructor (en geef je die mee als parameter).

ik hoop dat ik defineer/declareer nu goed gebruik :+

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Snake schreef op maandag 19 oktober 2009 @ 09:02:
Dan defineer je een naam in de Person klasse? En declareer je die in de constructor (en geef je die mee als parameter).

ik hoop dat ik defineer/declareer nu goed gebruik :+
Nee :'( Net verkeerd om.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je definieert sowieso niets in je constructor. De declaratie in de class is tevens de definitie.

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