[C++] Globale pointer oid. en usleep()

Pagina: 1
Acties:

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Ik wil een class zeg maar globaal beschikbaar maken, vanuit elk source file, dus:

code:
1
2
3
4
class CGlobal
{
  ..zooi hier..
} g_Global;

in CGlobal.h, waarna ik CGlobal.h include in files waar ik g_Global dus in nodig hebt.. Dit vind VC++ echter niet zo'n success, en ik krijg een hoop redefine errors..
CGlobal.obj : error LNK2005: "class CGlobal g_Global" (?g_Global@@3VCServer@@A) already defined in CClient.obj
CSocket.obj : error LNK2005: "class CGlobal g_Global" (?g_Global@@3VCServer@@A) already defined in CClient.obj

Weet iemand hoe dit gefixt kan worden? Ik heb ook geprobeerd een pointer te declaren in CGlobal.h ipv die class dus zo en daarna een new CGlobal in die pointer te gooien, maar daar geeft VC++ dus precies dezelfde errors.

En dan nog iets.. usleep() werkt kennelijk niet op win32, is daar een alternatief voor?

[ Voor 4% gewijzigd door Radiant op 11-04-2004 14:34 ]


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Heb je bovenaan de header een
code:
1
#pragma once

of nog "netter"
code:
1
2
3
4
#ifndef CGLOBAL_H
#define CGLOBAL_H
//code
#endif


Er is het win32 commando Sleep.

[ Voor 55% gewijzigd door SWfreak op 11-04-2004 14:36 ]


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Had daar al iets dergelijks..

#ifndef __INCLUDE_CGLOBAL__
#define __INCLUDE_CGLOBAL__
..
#endif

#pragma once net geprobeerd, dat fixt het niet

edit: Ow kijk :) sleep() neemt dus millisecs als argument. Waarom ze dat dan niet usleep noemen |:(

[ Voor 26% gewijzigd door Radiant op 11-04-2004 14:38 ]


  • writser
  • Registratie: Mei 2000
  • Laatst online: 06-05 22:26
gebruik je wel define statements om te voorkomen dat de header meerdere keren wordt ge-include? Voor CGlobal.h wordt dat dus:

code:
1
2
3
4
5
6
#IFNDEF CGLOBAL_H
#DEFINE CGLOBAL_H

class ...

#ENDIF


edit: Wil je de klasse globaal beschikbaar maken of een instantie van die klasse?

[ Voor 18% gewijzigd door writser op 11-04-2004 14:40 ]

Onvoorstelbaar!


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Ah wacht. Probeer eens:
code:
1
2
3
4
class CGlobal
{
};
static CGlobal g_Global();

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Ah mooi dat werkt :) Bedankt

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

SWfreak schreef op 11 april 2004 @ 14:40:
Ah wacht. Probeer eens:
code:
1
static CGlobal g_Global();
De static maakt het locaal voor het betreffende object, het is dus niet globaal als in de zin zoals de TS dat wil.

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Radiant16 schreef op 11 april 2004 @ 14:26:
Weet iemand hoe dit gefixt kan worden? Ik heb ook geprobeerd een pointer te declaren in CGlobal.h ipv die class dus zo en daarna een new CGlobal in die pointer te gooien, maar daar geeft VC++ dus precies dezelfde errors.
De instantiatie globaal maken in een .cc file, en vanuit de andere .cc files met extern werken.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Radiant16 schreef op 11 april 2004 @ 14:36:
...
edit: Ow kijk :) sleep() neemt dus millisecs als argument. Waarom ze dat dan niet usleep noemen |:(
Eh... omdat usleep() microsecondes neemt als argument misschien? ;)

@igmar: de static staat buiten de klassedeclaratie, en is dus wel globaal beschikbaar. Maar het singleton pattern is inderdaad mooier: maak gewoon alles binnen die klasse static en dan hoef je hem niet eens meer te instantiëren 8)

[ Voor 3% gewijzigd door WildernessChild op 11-04-2004 20:35 ]

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Nee, met static maak je hem zeker niet globaal beschikbaar. 'static' betekent in dit verband, een per Translation Unit, dwz een per .cpp file. Dat wil dus zeggen dat je er een hebt in a.cpp, en een andere met dezelfde naam in b.cpp.

static werd dus gebruikt in grote projecten, zodat developers in een file zich geen zorgen hoeven te maken dat ze per ongeluk een naam uit een andere file gebruikten. Tegenwoordig kan dat handiger met anonymous namespaces, dwz
C++:
1
2
3
namespace {
  int foo; // alleen voor deze file
}


Alle class members static maken lijkt aardig, maar ook dat werkt helaas niet. Static data die in een class gedeclareerd wordt (in een header) moet nog gedefinieerd worden in een .cpp. Een Meyers Singleton kan wel in een header:
C++:
1
2
3
4
5
class X {
  X();
public:
  X& singleton() { static X theOnly; return theOnly; }
};

#include/#endif voorkomt alleen dat je twee declaraties per translation unit hebt, maar niet twee definites per programma.

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


  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

WildernessChild schreef op 11 april 2004 @ 20:09:
@igmar: de static staat buiten de klassedeclaratie, en is dus wel globaal beschikbaar. Maar het singleton pattern is inderdaad mooier: maak gewoon alles binnen die klasse static en dan hoef je hem niet eens meer te instantiëren 8)
De declaratie wel, de instantiatie niet. Static is in dit geval niet wat de TS wil, aangezien je dan per object file een private copie van die variabele hebt. Hetgeen de TS gebruikt is zowel een declaratie als instantiatie in een, en dat kun je niet op die manier in een header file gebruiken.

code:
1
2
3
class blaat {
....
};


in de header file

code:
1
blaat foo;


in een .cc file, en

code:
1
extern blaat foo;


in de overige. Dit is overigens gewoon plain C, C++ zal hier ongetwijfeld wat netters voor hebben :)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:14
igmar schreef op 12 april 2004 @ 11:10:
Dit is overigens gewoon plain C, C++ zal hier ongetwijfeld wat netters voor hebben :)
Nee, dat gaat nog precies zo. (En waarom ook niet.)

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

igmar schreef op 12 april 2004 @ 11:10:
Dit is overigens gewoon plain C, C++ zal hier ongetwijfeld wat netters voor hebben :)
Nou je maakt natuurlijk liever niet iets globaal. Dus die 'blaat foo;' in je .cpp file, wordt een static member van je class. Maar dat maakt het een beetje lastig met instantieren, omdat het nu in de 'static' wereld leeft en op 'automagische' wijze wordt geinstantieerd. Dus dat los je op door er een pointer van te maken, en een static member functie die het object dan instantieert en de pointer er naar zet. Maar nu is er weer het risico dat twee verschillende 'clients' het object meerdere keren aanmaken wat niet de bedoeling was, of de pointer veranderen oid. Om het laatste op te lossen maak je de pointer private static, en voeg je toe/verander je de, static member functie om de pointer te retourneren en eventueel het object aan te maken als dat nog niet gebeurd is. Alle problemen zijn nu opgelost, en het is mooi encapsulated...en dat is het basis singleton pattern.

De problemen komen nu pas bij het destroyen van het object. Helemaal als verschillende singletons elkaar gebruiken. Dan krijg je dingen als phoenix singletons.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

igmar schreef op 12 april 2004 @ 11:10:
code:
1
2
3
class blaat {
....
};


in de header file

code:
1
blaat foo;


in een .cc file, en

code:
1
extern blaat foo;


in de overige. Dit is overigens gewoon plain C, C++ zal hier ongetwijfeld wat netters voor hebben :)
meestal stop je die extern declaration ook in de header :) Maar imho staat een static in een class in zo'n geval beter

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