Книга, которую вы просматриваете, Программируемые интервью - это (насколько я могу судить) не книга на C ++, а книга, предназначенная для подготовки вас ответить на вопросы, которые могут быть заданы на типичном техническом собеседовании. Я бы не стал воспринимать что-либо в книге как лучшую практику C ++, если только она не помечена как таковая (и, возможно, даже тогда).
Совет по размещению следующего указателя первым в структуре узла связанного списка исходит от языков, подобных C, где нельзя полагаться на реальное наследование, поддерживаемое компилятором. На самом деле идея заключается в том, чтобы реализовать что-то вроде наследования самостоятельно путем совмещения данных в структуре узла связанного списка. Рассмотрим:
typedef struct LinkedList {
LinkedListNode* next;
int type;
}
typedef struct Person {
LinkedList listNode;
char name[64];
int age;
}
typedef struct Address {
LinkedList listNode;
char streetAddress[128];
char city[32];
char state[2];
char zip[10];
}
typedef struct Employee {
Person person;
int department;
int salary;
}
LinkedList здесь является базовым типом - сам по себе не слишком хорош, но полезен в качестве отправной точки для узлов с большим количеством данных. Вам не нужно ничего знать о других типах для выполнения операций со связанным списком на узле ... вы можете привести любой указатель узла к LinkedList * и получить доступ к необходимой информации. Таким образом, вы можете иметь список Person и список Address, и обоими можно управлять с помощью одного и того же набора процедур. Точно так же вы можете привести Employee * к Person * и использовать любые операции, которые вы написали для Person на Employee. Если вы назначите соответствующие константы полю type
LinkedList, вы даже можете смешать PersonNode и использовать поле type
, чтобы позже определить тип каждого узла.
Это был полезный способ программирования более 20 лет назад. Конечно, это все еще работает, но большинство людей предпочли бы, чтобы компилятор управлял наследованием для них, если у них есть опция, и все современные объектно-ориентированные языки действительно предлагают эту опцию.
Урок: Поймите технику, если вы столкнетесь с ней в старом коде, но выберите другую реализацию для вашего нового кода, если можете.