对于Visitor
不完整类型的Acceptor
(aka class Acceptor;
) 就足够了。#include
因此,您可以通过包含Visitor
in来打破循环s,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
因为 OP 代码的所有成员函数都是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