31 października 2007

Kwiatki Gajusa Ceplusa (Część I.)

Bosh, jaki ten język jest głupi czasami, aż głowa boli...

Mam sobie klasę Bonzo, a w niej prywatną zmienną statyczną oraz publiczną statyczną funkcję do obsługi tej zmiennej:

//plik "bonzo.h"
class Bonzo
{
private:
static int LONGEST;
public:
static void setLongest(int i) { LONGEST = i; }
}

a w innym pliku mojego programu korzystam z tej funkcji wprost:
Bonzo::setLongest(6);

i nie mogę dojść, dlaczego kompilator, a dokładnie linker, wywala mi najbardziej chyba irytujący błąd w historii, czyli LNK2001:

error LNK2001: unresolved external symbol "private: static int Bonzo::LONGEST" (?LONGEST@Bonzo@@0HA)

Długa i dokłada analiza "Symfonii C++" Grębosza utwierdziła mnie w przekonaniu, że wszystko powinno być ok, bo przecież statyczne elementy klas mają zasięg globalny (a nie tylko ograniczony do jednego pliku, jak to jest z obiektami statycznymi globalnymi).
Dalsza lektura oświeciła mnie, że sama deklaracja zmiennej statycznej w klasie to jeszcze za mało, że oprócz tego potrzebna jest definicja, najlepiej widoczna z punktu, w którym się do tej zmiennej odnosimy. Już samo to jest pierwszym idiotyzmem języka, ale to nie wszystko.

Dodałem sobie bowiem do pliku "bonzo.h" linijkę:
int Bonzo::LONGEST;
i nic. Błąd jest dalej, co prawda inny - różny w zależności od tego, w którym miejscu powyższą linijkę umieszczę (przed czy po definicji klasy), ale kompilować się dalej nie chce.
Siedzę tak i czytam tego Grębosza, patrzę na ten kod, eksperymentuję z wsadzaniem tej cholernej definicji po różnych innych plikach i nic nie chce działać...

W końcu wsadziłem tą deklarację na początek pliku, w którym wywołuję funkcję Bonzo::setLongest... i wszystkie problemy znikają jak ręką odjął... ktoś wie, dlaczego?

...

...

...

ODPOWIEDŹ: Bo gdy definiujesz metodę klasy wewnątrz tej klasy, a nie poza nią, to ona automatycznie jest traktowana jak funkcja inline.
Czyli jej kod jest wstawiany WPROST w miejsce, w którym jest wywoływana. Czyli w moim przypadku - wprost do pliku, gdzie jest wywołana funkcja.
Bosh, jaki ten język jest głupi czasami, aż głowa boli...

2 komentarze:

Anonimowy pisze...

Welcome to the real world ;)
Nie będę kopać leżącego i nie będę pytać o możliwość użycia najpiękniejszego języka świata ;)

eXistenZ pisze...

nie mam takowej - projekt zadany, vis maior.

ale niedługo będziemy też na tym samym przedmiocie pisać w Javie, więc spoko.