Portál AbcLinuxu, 10. května 2025 05:52

Dotaz: static const členy C++

13.5.2009 15:57 Dušan Renát | skóre: 4
static const členy C++
Přečteno: 956×
Odpovědět | Admin
Mám třídu, ve které bych chtěl vícero položek ve stylu:
static const char INFO = 'I';
Pokud to správně chápu, jsou dvě možnosti:
1) Už v samotné třídě inicializovat stylem napsaným výše.
2) Ve třídě psát jen deklarace ve stylu
static const char INFO;
a v cpp souboru potom doplnit
const char INFO = 'I';
Nefunguje mi ani jedna z možností. V případě 1) dochází k chybám při linkování typu
/planner.cpp:45: undefined reference to `Action::INFO'
V případě druhém hází chybu ostatní jednotky, do kterých hlavičkový soubor dotyčné třídy includuju, konkrétně
 error: ‘Action::INFO’ cannot appear in a constant-expression
v příkazu switch jako větvící hodnoty.
Jak se tedy dají použít static const členy třídy, aby jednak neházely chyby při linkování, jednak se daly použít i ve switchi? Díky za každou pomoc.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.5.2009 16:16 volca
Rozbalit Rozbalit vše Re: static const členy C++
Odpovědět | | Sbalit | Link | Blokovat | Admin

Nejsou ty chybove hlasky prohozene?

Spravne reseni je v cpp souboru mit

const char Trida::INFO = 'I';

 

a linkovat vysledny objektovy soubor ke vsem ktere includuji header.

13.5.2009 16:33 Dušan Renát | skóre: 4
Rozbalit Rozbalit vše Re: static const členy C++
Přesně tak to mám a dělám, a řve to, že tu proměnnou INFO nemůžu použít ve switchi.
13.5.2009 17:34 volca
Rozbalit Rozbalit vše Re: static const členy C++

To bude nejspis tim ze switch nejde pouzit na neco co se neda overit pri kompilaci (on tu hodnotu bude znat az pri linkovani, zejo).

Ta staticka hodnota rovnou v header souboru byva problem kvuli tomu, ze potom existuje tolik instanci te staticke promenne, kolik je uspesnych include toho kodu.

 

Nezbyva nez bud pouzit ten enum nebo to udelat #define direktivou - kazdopadne ale v hlavickovym souboru.

13.5.2009 16:17 petris_ | skóre: 12
Rozbalit Rozbalit vše Re: static const členy C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
U konstant se automaticky doplnuje static, takze kdyz ji umistite do cpp souboru, tak je pristupna jen v tom souboru, kde je definovana. Pokud to tak nechcete, musite explicitne uvest extern.

Z toho, co jste popsal, mi vychazi jako lepsi reseni pouziti vnoreneho typu enum.
13.5.2009 16:23 volca
Rozbalit Rozbalit vše Re: static const členy C++

Vazne se u const doplnuje pro clenske promenne static? To se mi nejak nezda :/. Imho const clenske promenne maji jediny rozdil - lze je inicializovat pouze v inicializacnim bloku konstruktoru, a v kodu je lze pouzit pouze v const kontextu.

 

S navrhem pouzit enum souhlasim :)

13.5.2009 16:29 petris_ | skóre: 12
Rozbalit Rozbalit vše Re: static const členy C++
V tom cpp souboru mate:

const char foo = 'F';

const se implicitne linkuje jako static, takze je to stejne, jako byste napsal:

static const foo = 'F';

Proto to pri linkovani napise chybu. Duvod proc to tak je, je abyste mohl psat konstanty do hlavickovych souboru, jakasi nahrada za:

#define foo 'F'

13.5.2009 16:34 Dušan Renát | skóre: 4
Rozbalit Rozbalit vše Re: static const členy C++
Enum se dá takto použít i pro znaky? Já myslel, že jen pro celý čísla (protože ten výčet tak interně ukládá).
13.5.2009 16:39 petris_ | skóre: 12
Rozbalit Rozbalit vše Re: static const členy C++
enum e {
	INFO = 'I' // atd...
};
13.5.2009 16:45 Dušan Renát | skóre: 4
Rozbalit Rozbalit vše Re: static const členy C++
Každopádně, co je přesně špatně na tom, že includuju header ve stylu
class Trida {
static const INFO = 'I';
...
do všech cpp, kde to používám? To by mělo být správně, ne? Co je na tom přesně špatně? Nějak se mi nechce věřit, že bych ještě navíc potřeboval extern.
13.5.2009 16:46 Dušan Renát | skóre: 4
Rozbalit Rozbalit vše Re: static const členy C++
Oprava:
static const char INFO = 'I';
13.5.2009 18:53 vencas | skóre: 32
Rozbalit Rozbalit vše Re: static const členy C++

Statická proměnná musí být někde v paměti, proto je třeba ji vytvořit v právě jednom .cpp souboru a tam ji i inicializovat. Jinak by různé soubory includující stejný header nevěděly, kdo ji teda mám ve své paměti.

Jestli to chcete za každou cenu mít jen v .hpp, tak si to definujte jako metodu: const char getINFO(void){ return 'I'; }, to se pak už nikde definovat nemusí, bude z toho inline funkce.

13.5.2009 16:56 Dušan Renát | skóre: 4
Rozbalit Rozbalit vše Re: static const členy C++
Tímhle způsobem se to neudělá namapovaný na znaky, jen na čísla s hodnotami těch znaků. Což má hlavně tu nevýhodu, že to nemůžu přesměrovat do streamu pro vypsání jako znak, ne bez přetypování na znak.
13.5.2009 17:07 petris_ | skóre: 12
Rozbalit Rozbalit vše Re: static const členy C++
To umi vyresit pretizeny operator.

Pokud mi neverite s tim linkovanim, tak si to zkuste nebo si sezente referencni prirucku k c++.
13.5.2009 17:12 Dušan Renát | skóre: 4
Rozbalit Rozbalit vše Re: static const členy C++
Jestli věřím, že to takhle nefunguje? Věřím, vždyť to vidím :) Nebo nevím, na co se ptáte, jestli věřím.

Mluvím o tom ... ano, enum je řešení, s přetíženým operátorem na výpis i kompletní řešení bez nevýhod. Přesto bych se rád dozvěděl, proč nefunguje to původní řešení (ta původní dvě řešení), čistě ze zájmu.
13.5.2009 19:43 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: static const členy C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Příloha:
Mohl byste prihodit kompletni kus kodu, ktery vam nefunguje? Mne se priklad v priloze kompiluje bez problemu.
13.5.2009 22:17 Dušan Renát | skóre: 4
Rozbalit Rozbalit vše Re: static const členy C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Moc díky za všechny reakce, odpověď jsem si z nich vybral.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.