我目前在 C++ 中的 Header-Only 库中实现 Visitor-Pattern 遇到了麻烦。
考虑以下应该支持访问者访问的类(为了简单起见,没有接口(interface)):
class Acceptor
{
void accept(Visitor* v)
{
v->visit(this);
}
};
这是访客的界面:
class Visitor
{
virtual void visit(Acceptor* t) = 0;
};
在 Header-Only 库中,Acceptor.hpp 必须包含 Visitor.hpp,而 Visitor.hpp 必须包含 Acceptor.hpp。由于两个 header 都受 Include-Guards 保护,因此后面的 header 将失败。使用前向声明也不能解决问题。
最佳答案
对于 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
关于c++ - 仅 header 环境中 C++ 中的访问者模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58696015/