Nadanie przydomka const zmiennej static

0

Witam.
Chcę w klasie CGameObject mam zmienną static CGame * game. Chciałbym ustawic ją w trakcie działania programu, a później za pomocą const_cast dodać jej specyfiaktor const. Robię to w ten sposób:

void CGameObject::SetCGamePtr(CGame * ptr)
{
	game = ptr;
	const_cast<CGame * const>(game);
}

Niestety, kompilator protestuje podczas linkowania:

1>Linking...
1>snake_data.obj : error LNK2020: unresolved token (0A000336) "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>mouse.obj : error LNK2020: unresolved token (0A00037E) "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>LongerGameObject.obj : error LNK2020: unresolved token (0A000303) "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>GameMgr.obj : error LNK2020: unresolved token (0A00032D) "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>cgameobject.obj : error LNK2020: unresolved token (0A00000C) "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>snake_data.obj : error LNK2001: unresolved external symbol "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>cgameobject.obj : error LNK2001: unresolved external symbol "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>GameMgr.obj : error LNK2001: unresolved external symbol "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>LongerGameObject.obj : error LNK2001: unresolved external symbol "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>mouse.obj : error LNK2001: unresolved external symbol "public: static class CGame * CGameObject::game" (?game@CGameObject@@2PAVCGame@@A)
1>C:\makro\cp\snake cv++\snake na VC++ -wersja robocza\Debug\bgi.exe : fatal error LNK1120: 6 unresolved externals
1>Build log was saved at "file://c:\makro\cp\snake cv++\snake na VC++ -wersja robocza\Debug\BuildLog.htm"
1>bgi - 11 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Możecie pomóc? :-)

EDIT:
Post do usunięcia, problem leżał w dużej literze linijki wczesniej...

0

Co mialoby Twoim zdaniem czynic to:

const_cast<CGame * const>(game)

?

skracajac, const_cast jest operatorem RZUTOWANIA, mozesz wiec napisac tak, uwaga pseudokod:

int x = 5;
(CONST int) * pointernaConstInt = &x;
(NIECONST int) * zmienna = constcast< (NIECONST int) * >   (      pointernaConstInt    );

nawiasy sa bledne, zaznaczaja jedynie do czego const-nieconst sie odnosi

const-nieconst jest fragmentem TYPU zmiennej, a typ zmiennej raz zadeklarowanej jest NIEZMIENNY! nie mozesz zmiennej nadac CONST ot tak sobie nagle po kilkudziesieciu liniach dalej!

jezeli chcesz, aby Twoja zmienna byla const, musisz ja jako const zadeklarowac i kropka:

class IKS
{
     static CONST int zmienna;
};

int IKS::zmienna = -1;

po pierwotnej statycznej inicjalizacji na "-1" tejże const-zmiennej nie mozesz juz sobie zmienic na wlasciwa wyliczona/new'owana/etc wartosc, gdyz jest .. const. i teraz masz dopiero "kongo" z const_cast, pseudokod:

(CONST int) * constptr = &IKS::zmienna;
// *ptr = 5; // niewolno! const

(NIECONST int) * ptr2 = const_cast<(NIECONST int)*>(  &IKS::zmienna  );
*ptr2 = 5; // ok - const przelamany, zmienna zmieniona

mam nadzieje ze To Ci troche wyjasnilo, albo ze pierwotna linijka z const_cast i sformulowanie o "nadawaniu const" bylo totalna wpadka z gramatyki jezyka polskiego.. inaczej musisz zrewidowac woj poglad na typu zmiennych oraz modyfikatory const/volatile/..

edit: i od razu uprzedzam, ze łamiąc static-const w ten sposob narazasz sie na problemy.. niech ta zmienna bedzie private CGame* blah; zas wartosc pobieraj przez prosta public inline static CGame* getInstance(){ return blah; } - to podejscie wdrozy Ci readonly'ność, i zaoszczedzi kiedys klopotu jezeli wredny kompilator zechce cos zoptymalizowac (w co watpie, no ale..)

0

Wygląda na to że nie zaalokowałeś statycznego pola klasy.
class A
{
static int m;
};

musisz zdefiniować niestety:
int A::m = 0; // = 0; jest opcjonalne, to inicjalizacja

Poza tym przeczytaj poprzedni komentarz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1