Мое приложение реализует шаблон посетителя. У меня есть несколько разных посетителей, реализующих один и тот же интерфейс, и я пытаюсь решить, где лучше всего определить методы посещения для каждого из этих посетителей.
Сначала я предположил, что было бы лучше иметь один файл .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
}
Мой вопрос: допустимо ли / обычно ли определять методы для нескольких классов в одном файле таким образом?
это высоко необычно помещать функции посетителя в класс элемента по двум причинам
Других решений пока нет …