Przesyłanie obiektu przez wartość

0

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. ?

1

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.

1

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).

2

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”.

0

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.

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