Czy możesz wyjaśnić, dlaczego „NIE MOŻESZ” zaimplementować statycznej funkcji memeber klasy w swoim pliku CPP? jakiś błąd? Zwykle nie ma ograniczeń co do miejsca implementacji takiej funkcji.
zimaTTr
7
@winterTTr, Pytanie prawdopodobnie powstało, ponieważ większość przykładów / tutoriali w sieci nie przedstawia oddzielnego przykładu implementacji, zamiast tego deklaruje i definiuje go w nagłówku. Przynajmniej sześć pierwszych trafień mojej ulubionej wyszukiwarki na „statyczną funkcję składową w C ++” robi to w ten sposób i nie wyjaśnia, w jaki sposób można ją zaimplementować w osobnych plikach dla nowicjusza.
crobar
8
Podczas implementacji nie powtarzaj staticsłowa kluczowego. Wpisz staticsłowo kluczowe tylko w definicji klasy w pliku nagłówkowym
SomethingSomething
@crobar, masz rację, że brakuje przykładów złożonych z wielu plików. Trudno mi było to
Tak, możesz zdefiniować statyczne funkcje składowe w pliku * .cpp. Jeśli zdefiniujesz to w nagłówku, kompilator domyślnie potraktuje to jako wbudowane. Nie oznacza to jednak, że w pliku wykonywalnym będą istniały oddzielne kopie statycznej funkcji składowej. Proszę śledzić ten post, aby dowiedzieć się więcej na ten temat:
Czy statyczne funkcje składowe w języku c ++ są kopiowane w wielu jednostkach tłumaczeniowych?
Jeśli zdefiniujesz go w treści klasy, automatycznie będzie to wartość domyślna. Jeśli znajduje się w nagłówku poza treścią klasy, lepiej oznacz go albo inlinealbo templateotrzymasz wiele błędów definicji z konsolidatora.
Ben Voigt,
2
W pliku nagłówkowym powiedz foo.h
classFoo{public:staticvoid someFunction(params..);// other stuff}
W pliku implementacji wpisz foo.cpp
#include"foo.h"voidFoo::someFunction(params..){// Implementation of someFunction}
Bardzo ważne
Po prostu upewnij się, że nie używasz słowa kluczowego static w sygnaturze metody podczas implementowania funkcji statycznej w pliku implementacji.
@crobar, masz rację, że brakuje przykładów złożonych z wielu plików, więc postanowiłem podzielić się następującymi informacjami w nadziei, że pomoże to innym:
#includeDyrektywa dosłownie oznacza „skopiować wszystkie dane z tego pliku do tego miejscu.” Więc kiedy włączysz plik nagłówkowy, jest on tekstowo w pliku kodu i wszystko w nim będzie tam, daje lub przyjmuje skutek innych dyrektyw lub zamian makr, gdy plik kodu (teraz nazywany jednostką kompilacji lub jednostką tłumaczenia ) jest przekazane z modułu preprocesora do modułu kompilatora.
Co oznacza, że deklaracja i definicja Twojej statycznej funkcji składowej przez cały czas znajdowały się w tym samym pliku ...
static
słowa kluczowego. Wpiszstatic
słowo kluczowe tylko w definicji klasy w pliku nagłówkowymOdpowiedzi:
To jest.
test.hpp:
test.cpp:
Nie zawsze są one wbudowane, nie, ale kompilator może je stworzyć.
źródło
Spróbuj tego:
header.hxx:
class.cxx:
źródło
helper.hxx
helper.cxx
A.cxx
Aby dowiedzieć się więcej o tym, jak c ++ obsługuje funkcje statyczne, odwiedź: Czy statyczne funkcje składowe w języku c ++ są kopiowane w wielu jednostkach tłumaczeniowych?
źródło
Tak, możesz zdefiniować statyczne funkcje składowe w pliku * .cpp. Jeśli zdefiniujesz to w nagłówku, kompilator domyślnie potraktuje to jako wbudowane. Nie oznacza to jednak, że w pliku wykonywalnym będą istniały oddzielne kopie statycznej funkcji składowej. Proszę śledzić ten post, aby dowiedzieć się więcej na ten temat: Czy statyczne funkcje składowe w języku c ++ są kopiowane w wielu jednostkach tłumaczeniowych?
źródło
inline
albotemplate
otrzymasz wiele błędów definicji z konsolidatora.W pliku nagłówkowym powiedz foo.h
W pliku implementacji wpisz foo.cpp
Bardzo ważne
Po prostu upewnij się, że nie używasz słowa kluczowego static w sygnaturze metody podczas implementowania funkcji statycznej w pliku implementacji.
Powodzenia
źródło
@crobar, masz rację, że brakuje przykładów złożonych z wielu plików, więc postanowiłem podzielić się następującymi informacjami w nadziei, że pomoże to innym:
źródło
Oczywiście że możesz. Powiedziałbym, że powinieneś.
Ten artykuł może być przydatny:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
źródło
#include
Dyrektywa dosłownie oznacza „skopiować wszystkie dane z tego pliku do tego miejscu.” Więc kiedy włączysz plik nagłówkowy, jest on tekstowo w pliku kodu i wszystko w nim będzie tam, daje lub przyjmuje skutek innych dyrektyw lub zamian makr, gdy plik kodu (teraz nazywany jednostką kompilacji lub jednostką tłumaczenia ) jest przekazane z modułu preprocesora do modułu kompilatora.Co oznacza, że deklaracja i definicja Twojej statycznej funkcji składowej przez cały czas znajdowały się w tym samym pliku ...
źródło