Toon posts:

[c++] vector of objects? *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een programma waarin een aantal instanties van een class gemaakt moeten worden.
Hoe groot dit aantal is is niet van te voren bekend, moet ongelimiteerd zijn, en er moet op ieder moment een nieuw object bij kunnen worden gemaakt.

De objecten die worden gemaakt hoeven echter niets terug te geven aan het programma, het betreft een object dat een dialoog aan de gebruiker toont en de getoonde informatie opslaat in een file wanneer de gebruiker daarom vraagt.

Is een vector van objecten de beste manier om dit te implementeren?

en hoe declareer je een vector precies? ik heb geprobeerd VEC vectornaam in de headerfile te zetten maar dat werkt niet. vector<cMyObject> vectornaam ook niet.
# include <vector> staat in mijn header file.

Moet ik de vector maken bij de constructie van de classe die de andere objecten maakt? (de classe waarin ik dus probeerde de vector te declareren) of is er een andere manier om vectoren wel te kunnen declareren.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

volgende keer even de taal ook in de topictitle zetten, ajb.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
ja sorry kwam ik ook net achter, maar kan het met de edit niet aanpassen.

Maar het betreft dus C++ en ik gebruik MS VC 6.0

[ Voor 27% gewijzigd door Verwijderd op 18-12-2003 11:26 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
C++:
1
std::Vector< myObject> myVector;

Zou volgens mij genoeg moeten zijn om een vector te declareren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Dank u, _/-\o_

dat werkte inderdaad (moet alleen de hoofdletter klein maken)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op 18 december 2003 @ 11:50:
Dank u, _/-\o_

dat werkte inderdaad (moet alleen de hoofdletter klein maken)
Snap je nu ook waarom het niet werkte?

De hoofdletter had ik inderdaad even fout ( Werk teveel met C# enzo waar alle classes met hoofdletter beginnen ; )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Eerlijk gezegd niet precies.
vector is een macro en die blijkt dus onderdeel te zijn van std ofzo. maar verder weet ik niet nee. Ik ben nogal newbie wat programeren betreft, macro's weet ik weinig of niets van.
Ik gebruik echter ook de wxWindows library. die gebruikt ook macro's, maar die worden weer anders gedeclareerd. Zo moet je daar bijvoorbeeld DECLARE_EVENT_TABLE in de header zetter om vervolgens BEGIN_EVENT_TABLE en END_EVENT_TABLE in de source te gebruiken.

Aangezien ik nogal veel zaken heb die ik uit moet zoeken (Doen van statistische berekeningen, tekenen van grafieken en die opslaan in een gecomprimeerd formaat, bij voorkeur metafiles) en dit alles binnen enkele weken volledig moet werken, besteed ik even weinig aandacht aan de zaken die voor dit doel minder belangrijk zijn.
Als je me een korte uitleg wil geven dan is dat echter wel geapricieerd. :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:25

Creepy

Tactical Espionage Splatterer

Vector is een template, en geen macro. In een vector kan je allerlij types stoppen. Welk type wordt bepaald door je code. Er wordt echter wel @ compiletime op gecheckt of je ook wel steeds het juiste type erin stopt.

"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


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op 18 december 2003 @ 12:31:
Eerlijk gezegd niet precies.
vector is een macro en die blijkt dus onderdeel te zijn van std ofzo. maar verder weet ik niet nee. Ik ben nogal newbie wat programeren betreft, macro's weet ik weinig of niets van.
Ik gebruik echter ook de wxWindows library. die gebruikt ook macro's, maar die worden weer anders gedeclareerd. Zo moet je daar bijvoorbeeld DECLARE_EVENT_TABLE in de header zetter om vervolgens BEGIN_EVENT_TABLE en END_EVENT_TABLE in de source te gebruiken.

Aangezien ik nogal veel zaken heb die ik uit moet zoeken (Doen van statistische berekeningen, tekenen van grafieken en die opslaan in een gecomprimeerd formaat, bij voorkeur metafiles) en dit alles binnen enkele weken volledig moet werken, besteed ik even weinig aandacht aan de zaken die voor dit doel minder belangrijk zijn.
Als je me een korte uitleg wil geven dan is dat echter wel geapricieerd. :)
Een vector is zeker geen macro. Het is een Templated Class. Je kunt dus bij het declareren aangeven met wat voor Type een Vector werkt. Dat doe je dus door het Type object tussen < > te zetten. Een vector< object1 > is dan ook van een ander type als een vector< object2 >.

De reden dat je er std:: voor moet zetten is dat de vector in de namespace std zit. ( Net zoals de meeste standaard classes van c++ ).
Je moet dus aangeven uit welke namespace je de vector wil gebruiken. Je zou ook bovenaan je file kunnen zetten
C++:
1
using namespace std;

dan wordt er in je hele file standaard in de std namespace gekeken mocht je een class gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Je zou erover kunnen denken om niet de objecten maar pointers naar de objecten in je vector op te slaan.

Het is wat lastiger als je bijvoorbeeld met de iterators gaat werken ( ietwat cryptische notatie ) , maar het heeft ook een aantal voordelen :

- Je objecten worden niet gekopieerd, wat een voordeel kan zijn als ze erg groot worden.
- Als je derived objecten in je vector wil stoppen is dit ook geen probleem. In jou geval krijg je last van wat men noemt 'object splicing'

[ Voor 5% gewijzigd door farlane op 19-12-2003 09:23 ]

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.


Verwijderd

Ik sluit me aan bij farlane, ook is het handig om ervoor te zorgen dat de lijst van die pointers niet gewoon wordt gewist bij het stoppen van het programma, maar dat ook de pointer zelf wordt gedelete. Hier zal je auto_ptr oid voor moeten gebruiken ofwel een eigen linked list klasse schrijven die alles mooi opkuist indien nodig.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

auto_ptr's kun je niet in containers stoppen, omdat het geen copy-constructor en assignment semantics heeft

Dan kun je beter je eigen smart pointer klasse schrijven, of er eentje gebruiken van boost. Als je een linked list wilt dan kun je beter een std::list gebruiken, dan worden instanties van je klasse ook niet onnodig opnieuw aangemaakt en opgeruimd bij toevoegen en verwijderen uit de lijst

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: 09-04 22:08
Raw pointers in vectors (of andere containers) opslaan is een recept voor ongelukken, zeker bij beginners. De std:: containers gaan erg uit van value-behavior (elke kopie is gelijk) en pointers naar dynamisch gealloceerde objecten zijn dat niet (alleen de laatste kopie moet je deleten). Daarom valt auto_ptr ook af. Het heeft wel een copy-ctor en assignment, alleen de kopie is niet identiek aan de gekopieerde auto_ptr.

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
MSalters schreef op 20 december 2003 @ 13:47:
Raw pointers in vectors (of andere containers) opslaan is een recept voor ongelukken, zeker bij beginners.
Als je zorgt dat het alloceren en dealloceren van de objecten op een centrale plaats gebeurt, en dat een enkel object verantwoordelijk is voor die functionaliteit valt dat toch wel mee ?
Een inteligentere auto_ptr zou mooi zijn( boost heeft er vast wel een denk ik ), maar dit werkte voor mij al meerdere keren zonder problemen.

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Als je wil bikkelen kun je natuurlijk ook een auto_vector template deriven van vector ;)

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08

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

Pagina: 1