Zalety używania wskaźnika są przedstawione przez 3DH: inicjalizacja leniwy, redukcja zależności nagłówków i kontrola nad czasem życia obiektu.
Są także wady. Kiedy masz element danych wskaźnika, prawdopodobnie musisz napisać własny konstruktor kopii i operator przypisania, aby upewnić się, że kopia obiektu jest tworzona poprawnie. Oczywiście musisz również pamiętać, aby usunąć obiekt z destruktora. Ponadto, jeśli dodasz element danych wskaźnika do istniejącej klasy, musisz pamiętać o aktualizacji konstruktora kopiowania i operatora =. W skrócie, posiadanie elementu wskaźnika danych jest dla ciebie więcej pracy.
Inną wadą jest odwrotna strona kontroli nad czasem życia obiektu wskazywanego przez wskaźnik. Elementy danych innych niż wskaźniki są niszczone automatycznie, gdy obiekt jest niszczony, co oznacza, że zawsze można mieć pewność, że istnieją tak długo, jak obiekt istnieje. Za pomocą wskaźnika musisz sprawdzić, czy jest to nullptr
, co oznacza, że musisz zawsze ustawić go na nullptr
, gdy nic nie wskazuje. Konieczność radzenia sobie z tym wszystkim może łatwo doprowadzić do błędów.
Wreszcie dostęp do elementów innych niż wskaźnik może być szybszy, ponieważ są one ciągłe w pamięci. Z drugiej strony dostęp do elementu danych wskaźnika wskazującego obiekt przydzielony na stercie prawdopodobnie spowoduje brak pamięci podręcznej, co spowalnia.
Nie ma jednej odpowiedzi na twoje pytanie. Musisz spojrzeć na swój projekt i zdecydować, czy zalety elementów danych wskaźnika przeważają nad dodatkowym bólem głowy. Jeśli skrócenie czasu kompilacji i zależności nagłówka jest ważne, użyj pimpl idiom. Jeśli twój element danych może nie być konieczny dla twojego obiektu w niektórych przypadkach, użyj wskaźnika i przydziel go w razie potrzeby. Jeśli nie brzmią jak ważne powody i nie chcesz wykonywać dodatkowej pracy, nie używaj wskaźnika.
Do leniwego inicjowania, polecam używanie 'boost :: optional' kiedy tylko to możliwe. Jest bezpieczniejszy niż wskaźnik, ponieważ nie można na nim wykonywać arytmetyki. –
Ale wielu (jak ja) nie używa Boost - więc jest to bardzo niezależna platforma i framework ;-) ... Ja na przykład używam tylko Qt :-) – 3DH
Ale te, które nie używają 'boost' powinny :) – GManNickG