» »

[c++] globalne spremenljivke (extern)

[c++] globalne spremenljivke (extern)

zhigatsey ::

Živjo,

Vprašal bi vas samo če mi kdo lahko po domače razloži kako je najbolje uporabljati globalne
spremenljivke v cpp, brez da bi lahko prišlo do kakšnih težav...
Delam dll in rabim imeti en globalen objekt s katerim potem upravljajo exportane funkcije.
Mislil sem narediti namespace v katerem bi imel vse exportane funkcije in tudi globalni primerek
tega objekta. V kakšnih primerih pride v poštev beseda extern, teorijo sem prebral vedar bi rad še v praksi to videl. Na kakšen način se lahko izogneš globalnim spremenljivkam?

Hvala za odgovore

Vesoljc ::

uporabi "singleton"

class Singleton 
  {
  public:
      static Singleton* Instance();
  protected:
      Singleton();
      Singleton(const Singleton&);
      Singleton& operator= (const Singleton&);
  private:
      static Singleton* pinstance;
  };

from here

zgornji class ima zascitene osnovne konstruktorje ter "assignment" operator=, edini dostop je staticna metoda, ki ti vrne kazalec na instanco tega objekta. ob prvem klicu
Singleton *lpObject = Singleton::Instance();
//
lpObject->DoStuff();

se bo dinamicno kreirala ena in edina instanca tega objekta. v destruktorju pa se delete-nes ta pointer.

v dll-ju pa moras tako kot funkcijo tudi objekt exportat. zadevo lahko potem uporabis tudi kot "tovarno" objektov, ki jih potrebujes.
Abnormal behavior of abnormal brain makes me normal...

zhigatsey ::

Hvala za odgovor, samo rabim še malo informacij...
Da malo bolje podrobo opišem moj problem....
Imam c++-jevsko knjiznjico za delo s podatkovno bazo... Ker rabim v Delphiju to imeti,
moram narediti dll.... Ta knjiznjica ima recimo razred ClassDb, s katerim lahko
dodajaš userje, poganjas poizvedbe itd.... Iz dll-ja bodo exportane samo funkcije, kot naprimer
"bool ChangeUserPwd(char* userName, char* newPwd);" V tej funkciji bi pa potem izvedel ustrezno metodo primerka razreda tipa ClassDb, ki bi spremenila uporabniku geslo.
Torej imam recimo datoteki dblib.h, kjer so glave exportanih funkcij in pa dblib.cpp kjer bodo
definicije metod. Toda kam naj vtaknem globalno spremenljivko tipa ClassDb, s katerim bodo delale vse funkcije... V header v cpp file? V bistvu je rabim najprej v neko funkcijo, ki se mi bo
inicializirala tale razred... nekaj v stilu bool Init(char* database, char* userName, char* pwd)..
Ker nočem imeti samo tako da bo delalo, ampak da bo čimbolj pravilno...

Zgodovina sprememb…

Gundolf ::

> kako je najbolje uporabljati globalne spremenljivke v cpp
Tako da se jih izogibaš kot hudič križa.

> Delam dll in rabim imeti en globalen objekt s katerim potem upravljajo exportane funkcije.
Ne nikoli ne rabiš globalnega objekta.

No na bolj resno noto - vse se seveda da narediti s tistim extern ampak je veliko razlogov da se temu izogneš, in bolj malo je situacij (če sploh je kaka), ko je extern najboljša rešitev.
Vsaj jaz te ne razumem točno kaj želiš. V dll-ju implementirati nek razred al kaj? Zakaj sploh mora biti to dll, če bo delal na enem samem objektu?

Edit
Aja Delphi, šele zdajle mi je potegnilo.
Pripravit k sodelovanju C++ in Delphi razrede je pomoje rahlo utopična ideja (no ok, morda ima Borland to kako mašinerijo s katero Delphi ali pa C++ prepričaš da posnema drugea ampak to je že tko-tko). Tako da tisti extern, ki bi ga morda lahko imel v dll-ju (rahlo dvomim da ima dll lahko extern spremenljivke) ti itak ne bo prijel na noben Delphi razred.

Če že imaš dll, imej notri le funkcije (sej ne da bi sploh lahko v dll-ju imel razrede). Obdrži te funkcije simple kolikor se le da. Vse objekte imej le v Delphiju in naj ti c++ dela le na stringih recimo. Če pa že res nujno rabiš ta objekt in ne moreš brez njega potem pa Singleton, kot je Vesoljc predlagal. To ne bo globalen objekt kot si zaenkrat predstavljaš. Videl ga bo le tvoj dll. In ne rabiš nobene globalne spremenljivke. Razred sam poskrbi, da se ena spremenljivka ob prvi uporabi načara v RAM.

Zgodovina sprememb…

  • spremenil: Gundolf ()

zhigatsey ::

Ne saj ne mislim exportati razreda, vem da to ne gre, samo funkcije z osnovnimi tipi...
char* -> PCHar
int -> Integer
double -> Double

Shinobi ::

Bolj kot tale stala z Dllji se ti splaca kar direktno funkcije za Delphi poiskat pa je? Vsaj po mojem mnenju. Drugace pa lahko classe po normalnem postopku dobis iz DLLja, le v C++ jih moras exportat s predikatom DLLEXPORT pa je stvar resena. Potem pac namesto metode podedujes razred iz DLLja, kar pa zna biti v Delphiju malo problematicno.

zhigatsey ::

Vem da lahko razrede exportaš, samo jih ne moreš uporabljati v delphiju, zato to nima veze...
dll znam narediti, šlo se mi je samo zaradi globalnih spremenljivk v sami kodi dll-ja....

Vesoljc ::

c in delphi

meni je nekoc tega tole delovalo, sem pa moral rahlo popravati tiste generirane headerje
Abnormal behavior of abnormal brain makes me normal...

Zgodovina sprememb…

  • spremenil: Vesoljc ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++]Uporaba strukture v drugi .cpp datoteki

Oddelek: Programiranje
143059 (2762) mallard
»

Naprednješa knjiga o programiranju (koncepti, ...)

Oddelek: Programiranje
366051 (5222) noraguta
»

Qt Designer -> KDevelop C++ Error

Oddelek: Programiranje
352108 (1638) 'FireSTORM'
»

[ OOP ] Global vs. Not Global

Oddelek: Programiranje
141228 (1023) noraguta
»

[C++] for {}

Oddelek: Programiranje
291686 (1380) Gundolf

Več podobnih tem