[C++] char* naam; in iedere class zelfde waarde????

Pagina: 1
Acties:
  • 284 views sinds 30-01-2008
  • Reageer

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
ik heb met het onderstaande programma een probleem.

Ik maak in mijn programma gebruik van "geschakelde lijsten"
dat wil zeggen

een begin met een pointer theForward*
een aantal listNodes met een pointer theForward* en een pointer TheObject*
(zeg maar een soort van array zonder maximum)

als object geef ik een class schaatser mee.

deze maak ik aan in de main met:

code:
1
2
while(...)
     uitslag.add(*(new Schaatser(naam, nat, ritTijd)));


kan iemand mij vertellen waarom dit gebeurt?
hierin is uitslag de list. Het spreekt voor zich dat met add een nieuwe waarde wordt toegevoegd.

Schaatser zier er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Schaatser.h

class Schaatser
{
public:
    Schaatser(char*, char*, Time&);
    Schaatser(Schaatser&);
    Schaatser(void);

    int operator ==(const Schaatser&);
    long int operator <(const Schaatser&)const;

    char* getNaam(void);
    char* getNationaliteit(void);
    Time  getTime(void);

private:
    char* naam;
    char* nationaliteit;
    Time tijd;
};

inline Schaatser::Schaatser(char* eenNaam, char* nat, Time& eenTijd):
    tijd ( eenTijd)
{
    naam = eenNaam;
    nationaliteit = nat;
}

.......


nu wil het probleem dat in de lijst wel iederekeer bij een instantie van schaatser die juiste "Time" wordt bewaard maar niet de juiste "naam" en "nat".
als ik ze namelijk weer uit de lijst opvraag wordt altijd de laatst megegeven naam en nationaliteit weergegeven.

de fout zit zo goed als zeker niet in de list classes. (hij haalt wel het juiste adres op, is aangeleverd door een leraar en werkt met classes zonder char*-tjes wel.)

opvragen van de variabelen gebeurt met uit een schaatser wordt gedaan met behulp van methodes als :

code:
1
2
3
4
char* getNaam(void)
{
     retrun naam;
}

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Als ik het zo zie zet jij telkens een char-pointer in de class en die pointer is steeds hetzelfde. een pointer verwijst naar een geheugenadres. dus als je de waarde waar de pointer heen verwijst in of buiten het programma wijzigt dan komt dan wordt dat overal doorgevoerd. je kunt dus moeilijk een pointer voor dit soort doelen gebruiken want dan is het in elke class de zelfde waarde.

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
oke als dat zo is. hoe kan ik dan op een andere manier een "string" (=char-array) in mijn Schaatser zetten. en moet je om een pointer mee te geven niet een adres opgeven.

ik geef namelijk gewoon een char* mee (en ja das een pointer, eigenlijk is het een char[20] met daarin bijv. "Pietje";)

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
[nohtml]
dexter07051982 schreef op 05 februari 2003 @ 20:23:
kan iemand mij vertellen waarom dit gebeurt?
hierin is uitslag de list. Het spreekt voor zich dat met add een nieuwe waarde wordt toegevoegd.
Wat gebeurt er?
code:
1
2
3
4
5
6
7
8
inline Schaatser::Schaatser(char* eenNaam, char* nat, Time& eenTijd):
    tijd ( eenTijd)
{
    naam = eenNaam;
    nationaliteit = nat;
}

.......


nu wil het probleem dat in de lijst wel iederekeer bij een instantie van schaatser die juiste "Time" wordt bewaard maar niet de juiste "naam" en "nat".
als ik ze namelijk weer uit de lijst opvraag wordt altijd de laatst megegeven naam en nationaliteit weergegeven.
Doe dit (de assignment van de strings) eens als volgt:

code:
1
2
3
4
5
6
inline Schaatser::Schaatser(char* eenNaam, char* nat, Time& eenTijd):
    tijd ( eenTijd)
{
    strcopy (naam,  eenNaam);
    strcopy(nationaliteit, nat);
}

https://fgheysels.github.io/


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
je kunt ook gewoon het type std::string gebruiken:
C++:
1
2
#include <string>
std::string regel

edit:

strcpy helemaal vergeten

[ Voor 25% gewijzigd door Shadowman op 05-02-2003 21:24 ]


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
strcopy? wat moet ik daarvoor includen? string.h toch? en waarom kent ie hem dan niet

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
dexter07051982 schreef op 05 February 2003 @ 21:06:
strcopy? wat moet ik daarvoor includen? string.h toch? en waarom kent ie hem dan niet


Kijk es ff in de help, ik denk dat je idd string.h moet includen.
Welke compiler gebruik je, hoe schrijf je die include:

code:
1
#include <string.h>

:?

edit:
html rechten.... *zucht*

[ Voor 9% gewijzigd door whoami op 05-02-2003 21:10 ]

https://fgheysels.github.io/


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
zo doe ik het ook. en kent ie geen strcopy. wel strcpy. maar als ik die gebruik krijg ik een windows eror.

en hoe werkt die andere dan?
dat std::string regel.
daar heb ik namelijk nog nooit van gehoord.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
[nohtml]
dexter07051982 schreef op 05 February 2003 @ 21:15:
zo doe ik het ook. en kent ie geen strcopy. wel strcpy. maar als ik die gebruik krijg ik een windows eror.
Euh, jah sorry. Het is strcpy. :+

Welke error krijg je dan?

https://fgheysels.github.io/


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
C++:
1
2
3
4
5
6
inline Schaatser::Schaatser(std::string eenNaam, std::string nat, Time& eenTijd):
    tijd ( eenTijd)
{
    naam=eenNaam;
    nationaliteit=nat;
}

(alle char* veranderen in std::string)
std::string is gewoon c++ en hiervoor moet je <string> includen en voor strcpy <string.h> of <cstring>

[ Voor 24% gewijzigd door Shadowman op 05-02-2003 21:23 ]


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
die van windows xp. kan ik eventueel een raport verzenden. als ik gewoon mijn (foute) manier gebruik krijg ik die niet

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
dexter07051982 schreef op 05 February 2003 @ 21:23:
die van windows xp. kan ik eventueel een raport verzenden. als ik gewoon mijn (foute) manier gebruik krijg ik die niet


Hmm. je zult waarschijnlijk een Access Violation krijgen.
Ik heb hier geen C++ compiler meer staan, dus kan het niet voor je uittesten.

(Ik gebruikte vroeger die strcpy operator, maar dan wel met character arrays ipv pointer naar characters, maar ik denk niet dat dat een verschil moet uitmaken).

https://fgheysels.github.io/


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
das als het goed is hetzelfde
char* is volgens mij gelijk aan char hoi[].

en dan op die vorige van whoami nog. mag ik nog wel gewoon een char* heen sturen (zal wel niet) en wat moet ik dan wel heensturen en vooral hoe maak ik die aan. zoals ik al zei. ik ken dat hele ding nie

als ik dat in die regel zet doet ie daar trouwens nogal moeilijk over.
geeft ie ik weet niet hoeveel errors. kent ie niet

[ Voor 19% gewijzigd door dexter07051982 op 05-02-2003 21:47 ]


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Het toewijzen in de constructor gaat wel goed.
ook het toewijzen in de copyconstructor gaat goed.
het gaat fout bij het ophalen.

deze vraag is eigenlijk niet goed.
heb nog verder gezocht. en heb op een aantal plaatsen (kreeg ineens nog een ingeving) een cout erbij gezet of het toewijzen wel goed ging
het ligt voor zover ik nu kan beoordelen dus toch niet aan de class Schaatser.

ierdereen toch bedankt voor de hulp.

  • Unicorn
  • Registratie: Maart 2000
  • Laatst online: 29-04-2024

Unicorn

rogue soeper

Als ik zo moet gokken waarom je strcpy vastloopt, is het omdat de 'destination' niet naar een voldoende groot geheugengebied wijst om de kopie in te bewaren.

Probeer het eens met strdup(). Die neemt een char*, reserveert genoeg geheugen, maakt een kopietje, en geeft de pointer naar de kopie terug. Die kun je dan weer meenemen in je Schaatser. (Niet vergeten om ook weer hierop free() aan te roepen in je destructor).

(En na al dat pointer gegoochel in C blijkt maar weer, std::string en z'n STL broertjes zijn je beste vrienden. ;) )

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Shadowman schreef op 05 februari 2003 @ 21:20:
C++:
1
2
3
4
5
6
inline Schaatser::Schaatser(std::string eenNaam, std::string nat, Time& eenTijd):
    tijd ( eenTijd)
{
    naam=eenNaam;
    nationaliteit=nat;
}

(alle char* veranderen in std::string)
std::string is gewoon c++ en hiervoor moet je <string> includen en voor strcpy <string.h> of <cstring>


maak daar maar const std::string & van
en als je m returned ook
dat scheelt een hoop temporaries en buffer allocaties :)

.edit: een C-style string in quotes is trouwens een const char[] (behalve als je een char array daarmee initialiseert natuurlijk). Dit is dan ook niet correct:
C++:
1
2
3
4
5
6
7
8
9
void func (char * b)
{
    ....
}

int main ()
{
    func ("hoi");
}

[ Voor 20% gewijzigd door .oisyn op 05-02-2003 22:49 ]

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
.oisyn schreef op 05 February 2003 @ 22:45:
maak daar maar const std::string & van
en als je m returned ook
[/code]
Doe nou maar niet bij returns, dan moeten wij weer uitleggen waarom
code:
1
2
3
std::string const& foo( ) {
  return "Hello";
}

niet werkt. En om te leren proggen kan het ook geen kwaad om in eerste instantie die string te kopieren bij functie calls.

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

[nohtml]
MSalters schreef op 05 February 2003 @ 23:29:
[...]

Doe nou maar niet bij returns, dan moeten wij weer uitleggen waarom
code:
1
2
3
std::string const& foo( ) {
  return "Hello";
}

niet werkt
nou ja dat zien we dan wel weer. Bovendien houdt dat P&W wat levendiger :P
Maar het was meer een reactie op de poster van het stukje code dan een tip voor de topicstarter :)

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.


Verwijderd

Short comment...

leer wat de volgende dingen doen :
- pointers
- stack-based variabelen
- pass by reference / pass by value
- Reference counting

duurt wel een jaartje of 2, maar opeens kan je dan *wel* programmeren !
(Gewoon googlen, er is plenty over te vinden en er gaat een wereld van programmeer-mogelijkheden voor je open ! :))

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
[nohtml]
Verwijderd schreef op 11 February 2003 @ 02:43:
Short comment...

leer wat de volgende dingen doen :
- pointers
- stack-based variabelen
- pass by reference / pass by value
- Reference counting

duurt wel een jaartje of 2, maar opeens kan je dan *wel* programmeren !
Precies of het 2 jaar duurt eer je dat onder de knie hebt..... Het hangt gewoon af van de intelligentie van de persoon.
En precies of je enkel die dingen moet kennen om echt te kunnen programmeren....
Je moet ze wel snappen, maar als je die 4 items snapt/kent/kunt, wil dat niet zeggen dat je kunt programmeren.

https://fgheysels.github.io/

Pagina: 1