• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ CRTP, inicjalizacja pól statycznych

Object Storage Arubacloud
0 głosów
365 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez Ehlert Ekspert (212,670 p.)

Bry wieczór wink

problem nietrywialny z następującym kodem:
 

template<class Object, class State>
class Base{
    static int statyczna;
    State * currentState;
public:

    static void doSomething()
    {
        statyczna++;
        statyczna -= 10;
    }

    Base(State* cState)
            :currentState (cState){}

    Base(){};

    ~Base(){};
};

template<class Object, class State> int Base<Object, State>::statyczna = 1;

enum class MyState{};

class NewClass : public Base<NewClass, MyState>
{
//....
};

int main()
{
    Base<NewClass, MyState>::doSomething();
    return 0;
}

Powyższy kod się kompiluje. Problem w tym że mam to rozbite na pliki. Jeśli przeniosę ciało metody statycznej do odrębnego cpp kompilator krzyczy Undefined reference dla tejże metody. Z kolei, jeśli jej ciało zostanie w pliku h, to dostaję Undefined reference dla wszystkich pól użytych w metodzie statycznej.

Co robić? crying kolejność nazw plików w Cmakeu ma znaczenie? 

2 odpowiedzi

0 głosów
odpowiedź 11 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)

Jako mniej doświadczony od Ciebie to z tego co przeczytałem, to statyczne metody klas nie mogą zostać wywołane na rzecz któregokolwiek z obiektów z klasy. A po drugie, metody statyczne jako nieskojarzone z żadnym konkretnym obiektem klasy, mogą odwoływać się jedynie do statycznych danych składowych tej klasy. Definicja prawie słowo w słowo z książki, może o to chodziło w Twoim pytaniu. smiley

komentarz 11 grudnia 2016 przez Ehlert Ekspert (212,670 p.)

Definicja wzorowa. smiley Wszystkich tych zasad przestrzegałem w kodzie.

komentarz 11 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)

W takim razie przykro mi, więcej nic nie jestem w stanie pomóc przyjacielu. sad

komentarz 11 grudnia 2016 przez criss Mędrzec (172,590 p.)

statyczne metody klas nie mogą zostać wywołane na rzecz któregokolwiek z obiektów z klasy.

Mogą, ale nie muszą. Ofc. nie ma to żadnego znaczenia czy wywołasz z obiektu (obj.staticMethod()) czy nie (Klasa::staticMethod()), ale... mogą. 

0 głosów
odpowiedź 11 grudnia 2016 przez criss Mędrzec (172,590 p.)
edycja 11 grudnia 2016 przez criss

Jeśli przeniosę ciało metody statycznej do odrębnego cpp kompilator krzyczy Undefined reference dla tejże metody.

Bo szablony nie mogą być zdefiniowane w plikach cpp. 

Z kolei, jeśli jej ciało zostanie w pliku h, to dostaję Undefined reference dla wszystkich pól użytych w metodzie statycznej.

Jeśli robisz to tak jak jest w tym kodzie który wkleiłeś (tzn. definiujesz tą statyczną metode w definicji klasy, a definicja statycznego pola masz pod klasą), to nic dziwnego. Kompilator jeszcze nie widzi definicji statyczna, a ma kompilować metode korzystającą z niej.

Spróbuj tak (nie testowałem, ale myśle, że powinno działać):

/* To wszystko to header */
template<class Object, class State>
class Base{
    static int statyczna;
    State * currentState;
public:
 
    static void doSomething();
 
    Base(State* cState)
            :currentState (cState){}
 
    Base(){};
 
    ~Base(){};
};
 
template<class Object, class State> int Base<Object, State>::statyczna = 1;

template<class Object, class State> void Base<Object, State>::doSomething()
{
        statyczna++;
        statyczna -= 10;
}
 

 

Podobne pytania

0 głosów
1 odpowiedź 393 wizyt
pytanie zadane 26 kwietnia 2018 w C# przez Stami Gaduła (3,790 p.)
0 głosów
1 odpowiedź 288 wizyt
pytanie zadane 12 kwietnia 2018 w PHP przez niezalogowany
0 głosów
2 odpowiedzi 441 wizyt
pytanie zadane 27 sierpnia 2015 w C i C++ przez criss Mędrzec (172,590 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...