Caute,
chcel by som sa spytat, len pre informaciu, dajme tomu ze mame nejaku triedu pr CSpravaSuborov, ktora obsahuje funkciu na spravu suborov,
adresarov a podobne. Jednou z tychto funkcii je fukcia ktorej vstupnym parametrom je cesta nejakeho adresara, vysledkom je
retazec, ktory obsahuje cestu zo vstupneho parametra, s tym ze funcia pozrie ci je na konci retazca "path delimiter" cize lomitko,
ak nieje prida ho tam.
deklaracia :
class CSpravaSuborov
{
...
string incPathDelim(string sPath);
}
s tymto som vsak mal nasledovny problem. Nie vzdy som potreboval vytvorit objekt tejto triedy, ale potreboval som okontrolovat danu
cestu k directory. Preto som si vysledok v programe chcel vratit takto :
vysl = CSpravaSuborov::incPathDelim(getAppDir());
toto mi nefungovalo, vraj potrebujem mat existujuci object danej triedy. nepamatam si presne tu hlasku :(
na nete som nasiel riesenie takehoto tvaru :
class CSpravaSuborov
{
...
static string incPathDelim(const string &sPath);
}
to fungovalo presne ako som chcel
vedel by mi niekto objasnit tu deklaraciu nejak rozumne? Nieco malo o tom viem, ale radsej keby mi to presne dakto vysvetlil.
dik moc.
Fórum › C / C++
Zavolanie funkcie triedy bez vytvorenia objektu
![](img/forum_vlakno_help_vyreseno.png)
V podstatě sis odpověděl sám. K tomu, aby šla volat určitá veřejná metoda nějaké třídy, potřebuješ i její instanci.
Ovšem C++ nabízí další ze svých feature, a tou jsou právě statické metody a statické členské proměnné(jsou sdílené všemi instancemi třídy). Jenže to s sebou bere i jistá omezení - se statickými proměnnými lze pracovat, dokud neexistuje objekt, pouze se statickými funkcemi. Nejčastěji se to používá v případě nějaké factory(viz příklad,ale není to nic moc), nebo např.u Singletonu :
class Zvire
{public:
virtual ~Zvire() {}
};
class Prase:public Zvire
{public:
static Zvire* Create() {return new Prase;}
};
class Clovek: public Zvire
{public:
static Zvire* Create() { return new Clovek;}
};
class Factory
{public:
typedef Zvire* (*fun) ();
map<string, fun> data;
void insert(const string& name, fun f)
{ assert(f != NULL);
data.insert(make_pair(name, f));
}
Zvire* GetInstance(const string& name)
{ // nejaka ta kontrola
fun f = data[name];
return f();
}
};
Factory fc;
fc.insert("Prase", &Prase::Create);
fc.insert("Clovek", &Clovek::Create);
Zvire * p = fc.GetInstance("Prase"); // p bude Prase
To Jura_: Aha jasne, myslim ze rozumiem, este sa chcem spytat na toto : "(jsou sdílené všemi instancemi třídy)", ak som to spravne pochopil, dajme tomu ze v triede mam declarovanu static premennu, tak potom je spolocna pre vsetky objekty vytvorene z danej triedy? Ak sa hodnota zmeni v jednom objekte, je automaticky zmenena aj v inom?
a este mam 1 vec, sem tam sa stane, ze pri pouzivani programu, moze nastat napriklad nejaka chyba, vynimka a program "padne".
Ako mozem osetrit takuto situaciu?
Chcem aby sa chyba odchytila, ulozila napriklad do stringovej premennej a to by som si mohol zapisat do chybovnika?
Skusal som to pomocou try..catch, ale nefungovalo to dobre.
nieco na tento styl :
-------------------
bool chyba = false;
int *prem; /*= new int;*/
try
{
*prem = 10;
}
catch(string sErr)
{
zapisChybu(sErr);
chyba = true;
}
if (!chyba) {...}
-------------------
Nic moc priklad, ale ucel splni...program vyhodi message s acces violation a padne, tomu chcem zabranit. Ako sa to riesi?
To bruenor:
Co se týče členských statických proměnných, tak jsi to pochopil naprosto správně. Jen ještě taková poznámka - statické proměnné se musí inicializovat mimo tělo třídy(nelze je _inicializovat_ uvnitř konstruktoru - je to logické, když si uvědomíš, že statické proměnné ke své existenci nepotřebují žádný objekt). Malý příklad:
class A
{public:
static int num;
};
int A::num = 5; // tady je ta inicializace - musí být vně třídy
O výjimkách nic psát nebudu, protože na internetu je toho stokrát více a určitě mnohem lépe pospáno. Takže uvedu odkaz na zdroj, ze kterého jsem se učil já.
http://www.builder.cz/art/cpp/cpp_vyjimky.html
A tady na celý seriál:
http://www.builder.cz/serial24.html
![](img/forum_nove_psp_new.png)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vlastnosti objektu z Form1 do triedy — založil Tayson
Vytvorenie objektu z triedy nazvu v hodnote premennej ;) — založil Tom@sQo
Padání objektu bez fyzických vlastností — založil Corbieman
Vraceni dat z objektu bez moznosti je zmenit — založil SpatnyProgramator
Zavolanie metody v inej metode — založil marioff
Moderátoři diskuze