Каков наилучший способ объявления моих заголовочных файлов, если я хочу иметь следующие соединения в своем коде на С++, так что я не получаю ‘include вложенную слишком глубокую ошибку’?
В моем классе edge у меня есть некоторые функции, которые должны возвращать объект Node. То же самое для класса Edge, у меня есть функции, которые должны возвращать объект Node. Однако компилятор запрещает мне иметь этот вложенный элемент цикла.
Node.h
Edge.h
Как предложили другие, используйте защитники заголовков. Но также попробуйте объявить классы, о которых идет речь. Возможно, вам придется работать с указателями (а не с ценностями) хотя бы в одном из ваших классов, но не видя кода, мы не можем сказать.
Итак, edge.h должно понравиться что-то вроде:
Обратите внимание, что вам нужно будет определить свою функцию в отдельном файле С++, который затем включает # node.h «.
Если все это кажется очень сложным, попробуйте упростить свой дизайн. Вероятно, не обязательно, чтобы узлы и ребра знали друг о друге — достаточно односторонней зависимости.
И, наконец, имена, содержащие двойные символы подчеркивания, зарезервированы на С++ — вам не разрешено создавать такие имена в вашем собственном коде.
edge.h
Node.h
Обратите внимание, что я уже объявлял классы «Edge» и «Node» перед включением другого заголовка, так что к тому моменту, когда функция или функция-член определена, также определяется класс, который он возвращает.
Этого можно избежать, используя либо pragma guard, либо #pragma once (последний, если ваш компилятор поддерживает его).
Чтобы использовать прагма-охранники, просто выполните следующее:
Обязательно измените SOME_IDENTIFIER для каждого файла заголовка. Обычно люди делают это NAME_OF_HEADER_H ; убедитесь, что вы изменили оба экземпляра идентификатора, если вы его изменили.
Также, если вы это сделаете, убедитесь, что #include внутри защищает прагма.
Если вы просто хотите использовать #pragma once , и ваш компилятор поддерживает его, вам просто нужно добавить
вверху вашего файла заголовка.
В другой заметке подумайте о переносе определения функций functionA и functionB в свои собственные .cpp файлы и сохраняя только прототип в файлах .h, так что вы не получите ошибки компоновщика.
What is the best way of declaring my header files if I want to have the following connections in my C++ code, just so that I don’t get the ‘include nested too deeply error’?
On my edge class, I have some functions that need to return a Node object. Same for the Edge class, I have functions that need to return a Node object. However the compiler disallow me to have this nested loop thing.
Node.h
Edge.h

4 Answers 4
As others have suggested, use header guards. But also try forward declaring the classes in question. You may also have to work with pointers (rather than values) in at least one of your classes, but without seeing the code, we can’t tell.
So edge.h should like something like:
Note that you will have to define your function in a separate C++ file which then #includes «node.h».
If all this seems very complicated, then you should try simplifying your design. It is probably not necessary for nodes and edges to know about each other — a one way dependency should suffice.
And lastly, names containing double-underscores are reserved in C++ — you are not allowed to create such names in your own code.

Edge.h
Node.h
Note that I have forward declared the classes ‘Edge’ and ‘Node’ before the other header is included, so that by the time the function or member function is defined, the class it returns is also defined.

The problem with your include guards is that they don’t match!
You test for _SOMETHING (one underscore) and then if not found you define __SOMETHING (two underscores); these two should match else the include guard does not work!
As others have noted avoid starting things with underscores as those are reserved for libs and OS.

This is prevented by using either pragma guards or #pragma once (the latter if your compiler supports it).
To use pragma guards, simply do this:
Make sure to change SOME_IDENTIFIER for every header file. Usually people make it NAME_OF_HEADER_H ; make sure you change both instances of the identifier if you change one.
Also if you do this, make sure any #include s you do are inside the pragma guards.
If you just want to use #pragma once and your compiler supports it, you just have to add
to the top of your header file.
On another note, consider moving the definition of the functions functionA and functionB to their own .cpp files and keeping just the prototype in the .h files, so you don’t get linker errors.
Каков наилучший способ объявления моих файлов заголовки , если я хочу , чтобы иметь следующие соединения в моем коде C ++, просто так , что я не получаю «включает в себя слишком глубокой вложенности ошибки» ?
На моих краях класса, у меня есть некоторые функции, которые должны возвращать объект Node. То же самое для класса Эджа, у меня есть функции, которые должны возвращать объект Node. Однако компилятор запрещает мне иметь эту вложенную петлю вещь.
node.h
edge.h
Как и другие предложили, использовать защитный заголовок. Но попробовать вперед объявляя классы в вопросе. Кроме того, возможно, придется работать с указателями (а не значений), по крайней мере, один из ваших классов, но не видя код, мы не можем сказать.
Так edge.h хотел бы что-то вроде:
Обратите внимание , что вы должны определить вашу функцию в отдельном файле C ++ , который затем «node.h директив #includes».
Если все это кажется очень сложным, то вы должны попробовать упрощая конструкцию. Это, вероятно, не является необходимым для узлов и ребер, чтобы знать друг о друге — это один из способов зависимость должно хватить.
И, наконец, имена, содержащие двойные символы подчеркивания зарезервированы в C ++ — вы не можете создавать такие имена в собственном коде.
edge.h
node.h
Обратите внимание, что я жду объявил классы «Пограничное» и «Узел» перед другой заголовок включен, так что к тому времени, когда функция функции или члена определяются, класс возвращается также определен.
Проблема с INCLUDE охранников в том, что они не совпадают!
Вы проверить _SOMETHING (один подчеркивание) , а затем , если не найден вы определяете __SOMETHING (два подчеркивания); эти два должны соответствовать иначе включают охранник не работает!
Как уже отмечено, не начинать вещи с подчеркиванием, как те, которые зарезервированы для библиотек и в ОС.
Это предотвращается с помощью либо Pragma охранников или #pragma once (последний , если ваш компилятор поддерживает).
Для того, чтобы использовать Pragma охранников, просто сделать это:
Убедитесь в том , чтобы изменить SOME_IDENTIFIER для каждого файла заголовка. Обычно люди делают это NAME_OF_HEADER_H ; убедитесь , что вы измените оба экземпляра идентификатора , если вы измените один.
Кроме того, если вы сделаете это, убедитесь , что любой #include S вы находитесь внутри Прагма охранников.
Если вы просто хотите использовать #pragma once и ваш компилятор поддерживает это, вы просто должны добавить
в верхней части файла заголовка.
На другой ноте, рассмотреть вопрос о переходе на определение функций functionA и functionB для их собственных файлов .cpp и сохранить только прототип в заголовочных файлах, так что вы не получите ошибки компоновщика.