Getter generowany w pliku .hpp

0

Witajcie,

Używam CLion i zaznaczyłem kilka prywatnych atrybutów w .hpp po czym RMB->Generate->Getters. Te atrybuty dodało mu w pliku .hpp, a nie .cpp. Czy to poprawne? Jak zerknąłem do nagłówka od jakiejś klasy z Qt to tam normalnie są metody z samym return w .hpp, ale tam są oznaczone inline, natomiast mi IDE zrobiło nie inline. Nie uzna mi później kompilator multiple definitions? Czy jeśli dał bym to do .cpp to kompilator nie zoptymalizował by mi do inline bo po skompilowaniu .cpp mając tylko nagłówek do obcego pliku .cpp nie wiadomo by było co zawiera metoda (tak sobie to wytłumaczyłem, dlaczego tak zrobiło IDE, ale nie wiem jak jest na prawdę), co w przypadku program->dll było by pewne?

Może lepiej by było oznaczyć ręczne jako inline?

2

Krótko: Tak, to poprawne zachowanie.

Słowo inline w C++ jest tylko sugestią dla kompilatora, że tę funkcję warto skompilować jako inline. Kompilator ma prawo tego nie robić. Jest to zależne całkowicie od kompilatora.
Jak słusznie zauważyłeś umieszczanie definicji funkcji/metod w pliku nagłówkowym .hpp mogłoby spowodować problem wielokrotnych definicji. Dlatego każda funkcja zdefiniowana w deklaracji klasy w pliku nagłówkowym jest inline. Nawet jak słowa kluczowego brak.

Gettery i settery to dobre przykłady funkcji które warto zrobić inline. Dlatego, aby wymusić inline tych funkcji umieszcza się je często w pliku nagłówkowym, w deklaracji klasy. Są to zazwyczaj proste funkcje dlatego nie obniżają czytelności kodu deklaracji wg mnie.

Jak zauważyłeś w innych kodach źródłowych możesz znaleźć inne przypadki. To dlatego, że podejście do tego tematu zmieniało się wraz z rozwojem języka C++, standardu i doświadczenia programistów. Do dziś w C++ istnieją rzeczy które można podzielić na legalne ze względu na możliwość użycia w języku oraz 'moralne': czyli techniki które należy używać zamiast starszych.

Polecam https://isocpp.org/

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