Путем «определения типа» указателя вы фактически следуете практике C, а не практике C ++. В C для того, чтобы скрыть детали реализации, часто используется typedef, поскольку он допускает некоторую элементарную форму сокрытия данных:
typedef struct somestruct* pointer;
void foo(pointer p);
, если позже изменилось на
typedef struct someotherstruct* pointer;
void foo(pointer p);
вам не нужно изменять все параметры функции, которые используют указатель, чтобы "структурировать someotherstruct *", вы даже можете имитировать полиморфизм с этим, добавляя новые поля в someotherstruct.
В C ++ есть и другие способы достичь вышеупомянутого лучшего способа.
edit: возможно, скрытие данных - это слишком сильное слово, но оно позволяет вам изменить реализацию указателя, который использует указатель, без нарушения существующего кода (если все сделано правильно)