[C++] Static Object?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • prometheus345479
  • Registratie: Mei 2005
  • Laatst online: 12-10-2022
Hoi,

ik ben redelijk nieuw in het object georienteerd programmeren. En ik vroeg me af of iemand mij kon helpen...

Ik zou graag een static object willen maken.

In een functie blijven static variables bestaan nadat de functie gereturnd(?) wordt. En bij de volgende functiecall wordt de static variable niet opnieuw geinitialiseerd.

Ditzelfde gedrag wil ik met objecten doen. Ik heb dus een class Foo, en daarvan worden meerdere objecten gemaakt. Ieder object heeft zijn eigen parameters, die worden ingelezen uit een bestand. Ik wil het inlezen maar 1 keer doen, dus dat de opgeslagen parameters in ieder object blijven bestaan bij een nieuwe functiecall.

Het lijkt natuurlijk erg op een global, maar ik weet niet van tevoren hoeveel objecten er nodig zullen zijn, dus ik kan ze niet globaal declareren. (sowieso wil ik liever niet met globals werken...)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zolang je de instance van dat object 'vast houdt' gaat de inhoud toch niet verloren :? Of begrijp ik je nou verkeerd?

Je instantieert een object, de 'variabelen' worden gezet waar jij het over hebt en dan is het toch goed? Je moet alleen zorgen dat je het object niet wegmikkert als je de inhoud ervan wil bewaren...

[ Voor 46% gewijzigd door RobIII op 03-03-2009 11:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 14-08 13:04
Als ik je goed begrijp wil je objecten aanmaken, die langere tijd (dus niet gelimiteerd tot 1 functie-call) blijven bestaan...

Het idee is dan dat je met "new" je objecten aanmaakt. Hiervan krijg je dan een pointer die je moet bij gaan houden (bijvoorbeeld in een lijst). Zolang je de pointer onthoud, kan je bij je object komen.

(Mocht je klaar zijn met je object, dan is het wel de bedoeling dat je dit expliciet aangeeft door "delete" te gebruiken op je pointer.)

Anyway, dit is vrij basic OO programmeren...

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


Acties:
  • 0 Henk 'm!

  • prometheus345479
  • Registratie: Mei 2005
  • Laatst online: 12-10-2022
RobIII schreef op dinsdag 03 maart 2009 @ 11:48:
Zolang je de instance van dat object 'vast houdt' gaat de inhoud toch niet verloren :? Of begrijp ik je nou verkeerd?

Je instantieert een object, de 'variabelen' worden gezet waar jij het over hebt en dan is het toch goed? Je moet alleen zorgen dat je het object niet wegmikkert als je de inhoud ervan wil bewaren...
Zoals ik al zei, ik ben vrij nieuw in object georienteerd programmeren...

Hoe zorg ik ervoor dat een object niet wordt weggegooid als een functie returned? (of gebeurd dat nooit?)
Als dat zo is dan kan ik in de functie een static pointer naar ieder object maken, en is het probleem opgelost. (of kan het netter?)

Acties:
  • 0 Henk 'm!

  • Rollo
  • Registratie: Januari 2009
  • Laatst online: 10-09 14:11
Dat gebeurt nooit, zodra je een object aanmaakt met fiets gazelle=new fiets(blauw); zal het object altijd blijven bestaan onder de naam gazelle totdat je het object destruct.

Als je niet van tevoren weet hoeveel objecten je nodig heb kan je ze het best in een object array stoppen. Dat static is niet handig.

[ Voor 28% gewijzigd door Rollo op 03-03-2009 11:58 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

fiets gazelle=new fiets(blauw);
Je vergeet de * :)

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!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
peugeot106xsi schreef op dinsdag 03 maart 2009 @ 11:56:
Dat gebeurt nooit, zodra je een object aanmaakt met fiets gazelle=new fiets(blauw); zal het object altijd blijven bestaan onder de naam gazelle totdat je het object destruct.

Als je niet van tevoren weet hoeveel objecten je nodig heb kan je ze het best in een object array stoppen. Dat static is niet handig.
Je object blijft niet bestaan onder de naam gazelle, er word een object in het geheugen gemaakt, en gazelle bevat een geheugen adress die naar die gazelle wijst.
prometheus345479 schreef op dinsdag 03 maart 2009 @ 11:54:
[...]


Zoals ik al zei, ik ben vrij nieuw in object georienteerd programmeren...

Hoe zorg ik ervoor dat een object niet wordt weggegooid als een functie returned? (of gebeurd dat nooit?)
Als dat zo is dan kan ik in de functie een static pointer naar ieder object maken, en is het probleem opgelost. (of kan het netter?)
Je hebt 2 manieren van objecten creeeren ( en collecten ).

Als je ze op de volgende manier definieert
C++:
1
2
3
4
void MyFunc()
{
    Foo bar;
}

dan zal bar opgeruimd worden op het moment dat hij out of scope gaat.

Wil je dat een object een langer leven heeft dan kan je hem of in een hogere scope aanmaken, of je kan hem zelf aanmaken met het new keyword. Elk object wat je met new aanmaakt zal ergens weer met delete verwijderd moeten worden. Totdat een object ge delete word zal hij gewoon blijven bestaan, maar je moet natuurlijk wel zorgen dat je ergens nog de pointer naar het object hebt.

C++:
1
2
3
Foo* bar = new Foo();

delete bar;

[ Voor 4% gewijzigd door Woy op 03-03-2009 12:24 ]

“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.”


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-09 22:17
In C++ mag je ook een object static maken, in een functie of op module niveau. Dat heeft verder niets met new/delete te maken trouwens.

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!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
farlane schreef op dinsdag 03 maart 2009 @ 12:48:
In C++ mag je ook een object static maken, in een functie of op module niveau. Dat heeft verder niets met new/delete te maken trouwens.
Nee het heeft niks met static te maken, maar dat is eigenlijk zijn vraag ook niet. Wat hij wil weten is
Hoe zorg ik ervoor dat een object niet wordt weggegooid als een functie returned?

“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.”


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Static is een manier om de storage-type van een variabele aan te geven:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
int foo()
{
  static int bar;
  bar++;
  return bar;
}

void main()
{
  int a = foo(); //=1
  int b = foo(); //=2
  int c = foo(); //=3
}

de a b en c variabelen bevinden zich op de stack. Zodra de functie verlaten word, zijn die variabelen (en hun waarde) verdwenen. De static bar variabele bevind zich niet op de stack, en heeft een gereserveerd stukje geheugen zolang het programma draait. Hierdoor returned de functie foo telkens een andere waarde, immers de variabele bar blijft bestaan en bruikbaar in foo.

Dan nu in een object :)
C++:
1
2
3
4
5
6
7
8
9
10
class foo
{
  static int a;
  int b;

  void bar()
  {
    int c;
  }
};

a is static, en bestaat zolang het programma bestaat.
b is member, en hoort bij een instance van foo. Zolang die instance bestaat, bestaat b.
c is een variabele in een functie, en bestaat alleen als die functe uitgevoerd word, op de stack.

Wat ik DENK dat jij en andere mensen in dit topic niet weten/vergeten te vertellen is dat een pointer een storage type heeft, maar dat hoeft niet hetzelfde te zijn als het storage type van hetgene waarnaar verwezen word:
je kan bijvoorbeeld best een static pointer naar een object op de stack hebben. Over het algemeen echter, bewaar je je pointers in de scope van de class, en verwijzen ze naar een object op de heap. In de constructor haal je je objecten op, en in de destructor ruim je de objecten op. Dat object heeft dan een lifetime die jij bepaalt: het begint als je new doet, en eindigt als je delete doet, wat dan synoniem is voor de lifetime van het object zelf.

Uit jouw niet heel duidelijke omschrijving wil jij een bestand inlezen waar zich meerdere waarden in bevinden. Deze waarden zijn objecten van type Foo. Volgens mij wil je dan 2 soorten objecten, het waarde object Foo en een object dat alle waarden 1x inleest en dan bewaard, een Bestand object (een slechte naam, maar ik heb niet meer informatie :P)
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <vector>

class Foo;

class Bestand
{
  std::vector<Foo> waardes;

public:
  Bestand()
  {
    //open file, lees waarden in, bewaar in waardes verzameling, sluit bestand
  }

  Foo &Get(unsigned index) { return waardes[i]; }
} *g_bestand;

void main()
{
  g_bestand = new Bestand();
  //de rest van je programma
  //je kan nu overal "g_bestand->Get(0)" doen voor de eerste waarde
  delete g_bestand;
}

[ Voor 19% gewijzigd door MLM op 03-03-2009 13:11 ]

-niks-


Acties:
  • 0 Henk 'm!

  • prometheus345479
  • Registratie: Mei 2005
  • Laatst online: 12-10-2022
MLM schreef op dinsdag 03 maart 2009 @ 13:04:

Uit jouw niet heel duidelijke omschrijving wil jij een bestand inlezen waar zich meerdere waarden in bevinden. Deze waarden zijn objecten van type Foo. Volgens mij wil je dan 2 soorten objecten, het waarde object Foo en een object dat alle waarden 1x inleest en dan bewaard, een Bestand object (een slechte naam, maar ik heb niet meer informatie :P)
Sorry, ik zal een wat betere beschrijving geven van wat mijn probleem is. Erg bedankt voor je hulp in ieder geval...

Ik ben bezig met een dll voor een andere executable, waar ik niet bij kan. Wat de dll moet doen is natuurkundige grootheden die uit de exe komen omzetten in gemeten waarden.

daarvoor simuleer ik dus een sensor. De eigenschappen van een sensor staan opgeslagen in een tekstbestand. Iedere natuurkundige grootheid heeft zijn eigen sensor (b.v. magnetisch veld heeft een magnetische sensor, geluid heeft een microfoon als sensor, en stroom heeft een amperemeter als sensor)

Ik wil nu dus in mijn dll (buiten de scope van main, die in de executable staat) een object creeren genaamd Sensor. Het object Sensor moet gevuld worden door een tekstbestand in te lezen. (bijvoorbeeld via Sensor.Init(bestand).

Zodra het tekstbestand is ingelezen, moeten de instellingen bewaard blijven in het object. Ook als de dll returned naar de executable.

dat is dus wat ik wil.

En dan nu de oplossing, denk ik:

ik krijg info van de executable (b.v. een magnetisch veld)


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Ik kijk of er voor het eerst een magnetische sensor gebruikt wordt. met b.v.

static bool FirstRun; //true als ie voor het eerst gebruikt wordt, false daarna.

//Als eerste run, creer Sensor pointer, die ook statisch is. 
//(anders wordt ie weggegooid)

static Sensor* magneet = new Sensor;

//Dan sensorbestand uitlezen:

magneet.init(bestand);

//en dan de rest...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je in plaats van een aparte init methode het bestand aan de constructor van Sensor meegeeft, dan heb je die FirstRun ook niet meer nodig. De pointer wordt immers maar 1 keer geïnitialiseerd, waardoor de Sensor ook maar 1 keer aangemaakt wordt.

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!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Okay, wat is je probleem dan nog? Ik neem aan dat je executable een functie in je DLL aanroept, en daar stop je die code hierboven in, dat kan prima werken. Je hebt alleen geen opruim functionaliteit.

Je zou eventueel met DllMain oid je objecten kunnen aanmaken of opruimen, als je dat echt wilt, hoef je je daar in de aangeroepen functie niet meer over na te denken.

-niks-


Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 22-09 15:11
Je zou een Singleton kunnen maken:

C++:
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
//code van http://www.inquiry.com/techtips/cpp_pro/10min/10min0200.asp
//in .h file
class Singleton 
{
  public:
    static Singleton* Instance();
  protected:
    Singleton();
  private:
    static Singleton* pinstance;
};


//in .cpp file
Singleton* Singleton::pinstance = NULL;

Singleton* Singleton::Instance () 
{
  if (pinstance == NULL)  // is it the first call?
  {
    pinstance = new Singleton; // create sole instance
  }
  return pinstance; // address of sole instance
}

Singleton::Singleton() 
{ 
//... perform necessary instance initializations 
}


Deze gebruik je vervolgens:

C++:
1
2
Singleton* var1 = Singleton::Instance();
Singleton* var2 = Singleton::Instance();


var1 en var2 wijzen uiteindelijk naar dezelfde instantie.

[ Voor 4% gewijzigd door epic007 op 03-03-2009 14:03 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah ja daar heb je het Singleton anti-pattern ook weer, wat de TS in dit geval bovendien niet eens helpt :z

Daarnaast zou ik het in C++ gewoon zo implementeren:
C++:
1
2
3
4
5
Singleton * Singleton::Instance()
{
    static Singleton s_instance;
    return &s_instance;
}


Jij leakt, ik niet.

[ Voor 47% gewijzigd door .oisyn op 03-03-2009 14:18 ]

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!

  • prometheus345479
  • Registratie: Mei 2005
  • Laatst online: 12-10-2022
Bedankt voor de hulp!

Mijn probleem is inmiddels opgelost via een constructor die het bestand inleest, en vervolgens een static pointer naar een sensor object.

Een singleton is niet handig, want ik wil nu juist meerder objecten van dezelfde class hebben...

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-09 22:17
Woy schreef op dinsdag 03 maart 2009 @ 12:51:
[...]

Nee het heeft niks met static te maken, maar dat is eigenlijk zijn vraag ook niet. Wat hij wil weten is

[...]
Ehm, kun je me het nog een keer uitleggen dan hoe het zit dan, want of ik begrijp je post niet of ik heb al heel lang de betekenis van een static variabele verkeerd gehad.

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!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
farlane schreef op woensdag 04 maart 2009 @ 09:09:
[...]


Ehm, kun je me het nog een keer uitleggen dan hoe het zit dan, want of ik begrijp je post niet of ik heb al heel lang de betekenis van een static variabele verkeerd gehad.
Ik bedoelde dat hij eigenlijk niet wilde weten wat static precies deed, maar hoe hij de life-time van zijn object kan bepalen. Natuurlijk kan je die met static beinvloeden, maar jij gaat toch niet alle objecten die een langere life-time dan een method moeten hebben static maken. Dat is wat ik bedoelde.

[ Voor 10% gewijzigd door Woy op 04-03-2009 09:32 ]

“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.”

Pagina: 1