Wróciłem ostatnio do książki Jerzego Grębosza "Symfonia C++", pewnie większości znana i lubiana. I natknąłem się na fragment o przesyłaniu obiektu przez wartość. Dołączam do postu załącznik z owym fragmentem. I mianowicie mam problem ze zrozumieniem ostatniego akapitu w owym fragmencie, dlaczego ktoś mógłby pomyśleć że linker mógłby zaprotestować, że jest zdziwienie że występuje wielokrotnie itd. ?
Wydaje mi się, że chodzi tutaj o sposób definicji funkcji. Definicja wypisz() znajduje się w klasie, co oznacza że jest ona inline ( przynajmniej taka jest podpowiedź dla kompilatora, ostatecznie to on decyduje). Pozwala to na kilkukrotna definicję tej samej funkcji, a podczas linkowania najpierw są one łączone a później ich nadmiar usuwany. Bez wiedzy o tym, że funkcja ta jest inline można faktycznie pomyśleć, że definicja występuje wielokrotnie podczas dołączenia klasy w kilku plikach, co oczywiście spowoduje błąd linkera.
A ja mam wrażenie że za chwile były podany sposób ze strażnikiem nagłówka który nie pozwoli kilkukrotnie zdefiniować funkcji(kilkukrotnie dołączyć definicji klasy).
Wydaje mi się, że chodzi tu o taki „problem”:
• plik foo.cpp
inkluduje "osoba.h"
, w wyniku czego znajduje się w nim definicja funkcji wypisz()
(nagłówki wklejane są „na żywca”, całym tekstem w miejsce dyrektywy #include
)
• plik bar.cpp
również dołącza nagłówek "osoba.h"
i w nim również znajduje się definicja funkcji wypisz()
• w rezultacie mamy dwie identyczne funkcje osoba::wypisz()
w dwóch osobnych plikach .cpp
, osobno kompilowanych do .o
/.obj
• linker widzi obie kopie funkcji.
Błędu nie będzie, linker wybierze sobie po prostu jedną kopię funkcji. Ale gdyby funkcja była poza klasą — wtedy będzie błąd “multiple definition”.
Widzę, że masz starą edycję Ewangelii wg św. Grębosza ;) Zalecałbym kupić wersję "standard" albo poczekać na nowe wydanie związane z C++11.
Bo grzebanina w starej książce sprawi, że będziesz coraz to bardziej konserwatywny i raczej nie ruszysz nic spoza nowego standardu.