Для Visitor
достаточно неполного типа Acceptor
(он же class Acceptor;
). Следовательно, вы можете разбить циклические #include
с, включив Visitor
в Acceptor
, но не наоборот.
Чтобы продемонстрировать это, я сделал один файл - MCVE :
class Acceptor;
class Visitor
{
friend class Acceptor;
virtual void visit(Acceptor* t) = 0;
};
class Acceptor
{
void accept(Visitor* v)
{
v->visit(this);
}
};
Живая демоверсия на coliru
Примечание:
Мне пришлось добавитьfriend class Acceptor
потому что все функции-члены кода OPs private
. Однако даже для этого достаточно неполного типа class Acceptor
.
С отдельными файлами:
Файл visitor.h
:
#ifndef VISITOR_H
#define VISITOR_H
class Acceptor;
class Visitor
{
friend class Acceptor;
virtual void visit(Acceptor* t) = 0;
};
#endif // VISITOR_H
Файл acceptor.h
:
#ifndef ACCEPTOR_H
#define ACCEPTOR_H
#include "visitor.h"
class Acceptor
{
void accept(Visitor* v)
{
v->visit(this);
}
};
#endif // ACCEPTOR_H