Zavolanie funkcie triedy bez vytvorenia objektu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Zavolanie funkcie triedy bez vytvorenia objektu – C / C++ – Fórum – Programujte.comZavolanie funkcie triedy bez vytvorenia objektu – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
bruenor0
Newbie
16. 5. 2007   #1
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Jura_0
Stálý člen
16. 5. 2007   #2
-
0
-

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

Nahlásit jako SPAM
IP: ...–
bruenor0
Newbie
18. 5. 2007   #3
-
0
-

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?

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
18. 5. 2007   #4
-
0
-

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



Nahlásit jako SPAM
IP: ...–
bruenor0
Newbie
18. 5. 2007   #5
-
0
-

To Jura_:super dik moc:)

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 80 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý