对于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);
}
};
Live Demo on 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
本文链接:https://www.f2er.com/3165781.html