2014-01-14 8 views
1

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

Я пишу библиотеку в 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 в своем заявлении.

+0

Какие преимущества вы пытаетесь достичь с помощью встраивание методов? Представление? Избегайте создания и дополнительного файла? Что-то другое? –

+0

Эффективность @DaleWilson, так как методы имеют длину 1 или 2 строки. У меня есть '.cpp', который имеет более длинный метод. – bolov

+0

Для того, что стоит, влияние на производительность почти наверняка не стоит беспокоиться, и, кроме того, хороший оптимизирующий компилятор может в конечном итоге вникнуть в функции (см. Http://stackoverflow.com/questions/1626248/does-gcc- инлайн-с-функция-без-на-рядного ключевое слово). – CmdrMoozy

ответ

4

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

Написание определения в файле .cpp действительно является правильным решением. Вам нужно переслать объявление Exception в CallStack и перенести данные о реализации для функций, которые используют Exception в .cpp-файлы.

2

Создать отдельные заголовки для объявлений (foo-declarations.hpp) и инлайн (foo-inlines.hpp), и включает в себя в следующем порядке:

#include "Callstack-declarations.hpp" 
#include "Exception-declarations.hpp" 
#include "Callstack-inlines.hpp" 
#include "Exception-inlines.hpp" 

палочки этой четыре строки в другом заголовке "Callstack+Exception.hpp", если вы не хотите повторять четыре строки везде , Или для минимального включения:

// Exception.hpp 
#include "Callstack-declarations.hpp" 
#include "Exception-declarations.hpp" 
#include "Exception-inlines.hpp" 
// Callstack.hpp 
#include "Callstack-declarations.hpp" 
#include "Exception-declarations.hpp" 
#include "Callstack-inlines.hpp" 
+0

Это очень интересное решение, однако мне не нравится, что мне нужно создать много заголовков. Я решил включить определение в файл '.cpp'. – bolov

Смежные вопросы