Могу ли я включить несколько файлов .hpp в другой файл .hpp? - PullRequest
1 голос
/ 11 апреля 2020

Я сейчас работаю над проектом на C ++. Короче говоря, у меня есть 3 класса и основной файл. cpp.

1) Класс списка // использует вектор 2) Класс кучи 3) Класс дерева // BST

Для организации Я правильно разделил каждый класс на отдельные файлы, а именно .hpp и. cpp.

Конечно, чтобы получить доступ ко всем функциям каждого класса в моем основном файле. cpp, я # включил все три файла .hpp.

Все работало слаженно, пока я не включил файл «List.hpp» в «heap.hpp» и «Tree.hpp».

Что странно, так это то, что не было никакой ошибки, которая появлялась, когда я только включал «List.hpp» в отдельный отдельный заголовочный файл, такой как «heap.hpp».

Но когда я по какой-то причине я включил «List.hpp» в оба метода, которые работали в прошлом, больше не работают.

Только методы, которые полагались на «List» как параметр, больше не работают (они просто ничего не возвращают).

Я не уверен, почему это произошло. Это второй раз, когда это случилось со мной, и я хотел бы знать, почему, поэтому я не делаю ошибку в будущем.

Ответы [ 3 ]

2 голосов
/ 11 апреля 2020

Простое правило:

Все файлы, независимо от того, являются ли они файлами *. cpp или * .h, должны включать все остальные заголовочные файлы, необходимые для компиляции этого файла.

Если файл * .h нуждается в определении из другого файла * .h, поэтому вы должны включить его прямо отсюда.

Если вы сделаете это не так, вам придется иметь дело с правильным порядок включения ваших заголовочных файлов из третьего файла, что может быть неприятно.

Но вы увидите, что по мере роста ваших проектов вы часто больше не будете использовать включения и даже файлы, которые не включают в себя все необходимые зависимости, но скомпилируйте нормально, потому что другие файлы, включенные ранее, уже содержат то, что вам нужно.

Есть помощник для управления такими вещами: включает то, что вы используете

А также basi c: используйте защитные приспособления типа #pragma once или старый добрый стиль #ifndef XYZ #define XYZ #endif

1 голос
/ 11 апреля 2020

в заголовочных файлах, используйте предварительное объявление вместо включения заголовков и включайте их в свои исходные файлы, если у вас нет веских оснований для их включения.

0 голосов
/ 11 апреля 2020

Прежде всего, расширение не имеет значения. Включаемый файл может быть hpp, h или любым другим, даже cpp возможен. Препроцессор просматривает директиву #include и файл, который вы указали. Тем не менее, h и hpp являются соглашениями для использования, поэтому, пожалуйста, не включайте cpp файлы.

Теперь, чтобы понять, как работает компилятор, каждая директива #include означает, что содержимое этого файла полностью обработано. Это может быть эквивалентно вставке содержимого всего файла в ваш файл c / cpp.

Теперь представьте, сколько будет обрабатывать компилятор для этого файла, особенно если у вас есть #include в других ваших включениях.

Использование предварительных объявлений - это практика, которую вы найдете в большинстве включений, и она должна быть предпочтительной, если вы хотите избежать коллизий кода. Сказав это, все еще существуют ситуации, когда вы хотите избежать предварительных объявлений, потому что, если сегмент кода будет создан с помощью библиотек или других объектов, на которые вы ссылаетесь, вы можете потерять производительность. Но это обычно происходит только тогда, когда очень простая функция вызывается очень часто, возможности, когда компилятор сможет встроить ваши функции -> Оптимизации.

Просто помните об этом.

...