Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Upotrba "static vector" u dva razlicita cpp fajla.

  • 7 odgovora
  • 2.979 pregleda

Najnovija ↓

Upotrba "static vector" u dva razlicita cpp fajla. 08.04.2010. u 22:04 · pre 201 mesec #1
Potrebno mi je da u dva razlicita cpp fajla pristupim istom vectoru.

Ubacio sam u "stdafx.h"
static vector<int> availableSystemPorts;


U jednom cpp fajlu ga punim sa:

availableSystemPorts.push_back(0);
availableSystemPorts.push_back(3);
availableSystemPorts.push_back(1);
availableSystemPorts.push_back(2);

i availableSystemPorts.size() vraca 4 kako je i ocekivano.

U drugom cpp fajlu availableSystemPorts.size() vraca 0.


Ne znam gdje grijesim, kako mogu postici da i u drugom cpp fajlu vidim istu instancu availableSystemPorts i da mi i drugom slucaju vrati 4?


Primjer koda koji demonstrira moj problem (vc2008 express):
Link za vc2008 express primjer

Potpis
http://www.padfm.com
Re: Upotrba "static vector" u dva razlicita cpp fajla. 08.04.2010. u 22:25 · pre 201 mesec #2
Ne valja ti poso. Najbolji nacin za tretiranje takve situacije je da koristis singleton koji daje pristup pomenutom vektoru. Na primer:

Code:


#ifndef  SINGLETON_HH
#define SINGLETON_HH

//singleton.h
#include <vector>
class s_singleton {
public: 
        std::vector<int> availableSystemPorts;
    static s_singleton& instance (void) {
        static s_singleton inst;
        return inst;
    };
#ifndef __BORLANDC__
private:
#endif /* __BORLANDC__ */
    ~s_singleton(void) {}
private:
    s_singleton(void){
        availableSystemPorts.reserve(65536);
    }
    s_singleton(s_singleton const&);
    s_singleton& operator=(s_singleton const&);
};

#endif /* SINGLETON_HH */

Pa zatim u cpp fajlu:

//test1.cpp

#include "singleton.h"

int main(void) {
  s_singleton::instance().availableSystemPorts.push_back(123);
  s_singleton::instance().availableSystemPorts.push_back(234);
  s_singleton::instance().availableSystemPorts.push_back(111);
  s_singleton::instance().availableSystemPorts.push_back(100);
  return 0;
}

//itd


Potpis
Tko leti vrijedi
Re: Upotrba "static vector" u dva razlicita cpp fajla. 08.04.2010. u 23:51 · pre 201 mesec #3
Razlog zašto originalni poso ne valja je vrlo jednostavan. Ključna reč static u ovom kontekstu označava promenljivu koja je vidljiva samo u trenutnoj kompilacionoj jedinici (cpp fajlu). Drugim rečima, ako u 50 cpp fajlova definišeš static int x to je u stvari 50 promenljiva x, i svaka od njih je vidljiva samo u sopstvenom .cpp (ili bolje da kažemo .obj) fajlu. To što si tu globalnu promenljivu stavio u zajednički heder (pa čak i ovaj prekompajlirani) ne utiče ni na šta. Kompajler zapravo i ne vidi hedere, nego za svaki .cpp fajl vidi jedan džinovski listing u koji su utrpani svi hederi, jedan za drugim, i jedan u drugom. U svakom od tih velikih listinga se pojavljuje tvoja promenljiva, ali pošto je u pitanju globalna static promenljiva, ona je vidljiva samo unutar odgovarajućeg .obj fajla.

Zaključak - one globalne promenljive koje treba da deliš u više .cpp fajlova nemoj da deklarišeš kao static. Ovde sad postoje začkoljice oko korišćenja globalnih promenljivih, i ovo rešenje sa singletonom je rešenje za te nenavedene začkoljice.
Re: Upotrba "static vector" u dva razlicita cpp fajla. 09.04.2010. u 20:41 · pre 201 mesec #6
Pokušao sam da stavim extern u drugi cpp fajl a da ga u prvom deklarišem bez static i sve radi OK.

Juče sam istu stvar pokušao ali nisam pomislio da skinem static, čak sam mislio da ako stavim static da to znači da je promjenjljiva vidljiva u svim fajlovima/modulima.

Program na kojem radim ima više dialog funkcija koje pokušavam da prebacim u druge cpp fajlove, radi preglednosti, ali sam naletio na ovaj problem.

Tu imam i neke thread funkcije koje takođe pristupaju istom vektoru tako da mislim da je opcija sa singleton klasom sigurnija varijanta.

Bolje poznajem C nego C++ tako da prije nego primjenim ovu klasu sa singletonom treba da razumijem kako to radi.

Hvala svima na odgovorima! Mnogo sam naučio!

Pozdrav,
Ljubiša
Potpis
http://www.padfm.com
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme