2013-09-12 1 views
0

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

Я сначала предположил, что было бы лучше иметь единственный .cpp-файл, содержащий все определения для одного посетителя (по одному файлу на посетителя). Этот подход приводит к каждому файлу определения посетителя, содержащему довольно много директив #include, как для посещенных элементов, так и для любых вспомогательных функций, которые требуется для каждого метода посещения.

В качестве альтернативы, я могу определить методы посещения для каждого посетителя в файлах .cpp, содержащих определения для каждого элемента, при таком подходе требуемые директивы include уже есть (и поэтому не повторяются), за исключением заголовка посетителей. Заголовок посетителя содержит только прямые объявления каждого из элементов, поэтому преимущество этого подхода заключается в том, что количество включенных заголовков сокращается в целом.

elementa.cpp 

#include ... 
    ElementA specific stuff. 
#include ... 

void ElementA::accept(Visitor &visitor) { 
    visitor.visit(*this); 
} 

void VisitorA::visit(ElementA &element) 
{ 
    //do cool stuff 
} 

void VisitorB::visit(ElementA &element) 
{ 
    //do other cool stuff 
} 

Вопрос в том, приемлемо ли/обычно определять методы для нескольких классов в одном файле таким образом?

+0

Почему бы не создать заголовок, который включает в себя многие/самые распространенные заголовки 'Element'? – dyp

+0

@DyP У меня такое впечатление, что если я это сделаю, тогда мои компиляционные времена снова начнут расти. – spir

+0

Эти заголовки являются кандидатами на предварительную компиляцию. Кроме того, я сомневаюсь, что заголовки, содержащие только определения классов, а не определения (члены), серьезно влияют на время компиляции, если у вас их очень мало. Если это имеет значение, вы можете создать несколько заголовков для разных категорий. – dyp

ответ

0

Это высоко необычно поставить функции посетителя в классе элемента по двум причинам

  • Это означает код каждого посетителя разгоняется. Общее правило состоит в том, что код класса находится в одном месте.
  • Вся цель Посетителя - отделить алгоритмы от элементов. Нет причин отталкивать их, помещая их в один и тот же .cpp