Я знаю, что на этом сайте есть много ответов о круговой зависимости, но ни один из найденных мной не может решить мою проблему, главным образом потому, что мои определения встроены в заголовки.Еще одна круговая зависимость заголовка
Я пишу библиотеку в C++ 11. Для упрощения, у меня есть два класса:
Exception
вException.hpp
CallStack
вCallStack.hpp
.
Зависимости:
Exception
делает интенсивное использованиеCallStack
(как в декларациях и определениях нуждается в полного типа изCallStack
) такException.hpp
включаетCallStack.hpp
.CallStack
не нуждается вException
вообще в своем заявлении. Просто нужно выкинутьException
(вызывает конструкторException
не по умолчанию) в одном из определения члена (operator[]
), поэтому в определении требуется полный типException
.
Я знаю, что если я пишу определение в .cpp
файле, я решить эту проблему, но так как все методы и конструкторы не более 2-х строк, я решил определить их рядный, что означает, что они должны быть определены в заголовке .hpp
.
Решение, имеющее перед декларацией декларацию и включение другого заголовка между декларацией и определением, не работает, поскольку, как я сказал, Exception
нуждается в полном типе CallStack
в своем заявлении.
Какие преимущества вы пытаетесь достичь с помощью встраивание методов? Представление? Избегайте создания и дополнительного файла? Что-то другое? –
Эффективность @DaleWilson, так как методы имеют длину 1 или 2 строки. У меня есть '.cpp', который имеет более длинный метод. – bolov
Для того, что стоит, влияние на производительность почти наверняка не стоит беспокоиться, и, кроме того, хороший оптимизирующий компилятор может в конечном итоге вникнуть в функции (см. Http://stackoverflow.com/questions/1626248/does-gcc- инлайн-с-функция-без-на-рядного ключевое слово). – CmdrMoozy