我目前在实现 Visitor-Pattern 时遇到困难在 C++ 的仅 header 库中。
考虑以下应该支持访问者访问的类(为了简单起见,没有接口(interface)):
class Acceptor
{
void accept(Visitor* v)
{
v->visit(this);
}
};
这是访问者的界面:
class Visitor
{
virtual void visit(Acceptor* t) = 0;
};
在仅 header 库中,Acceptor.hpp 必须包含 Visitor.hpp,并且 Visitor.hpp 必须包含 Acceptor.hpp。由于两个 header 均受 Include-Guards 保护,后一个就会失败。使用前向声明也不能解决问题。
最佳答案
对于Visitor
,不完整类型的Acceptor
(又名class Acceptor;
)就足够了。因此,您可以通过在 Acceptor
中包含 Visitor
来打破循环 #include
,但反之则不然。
为了演示这一点,我制作了一个文件 - MCVE :
class Acceptor;
class Visitor
{
friend class Acceptor;
virtual void visit(Acceptor* t) = 0;
};
class Acceptor
{
void accept(Visitor* v)
{
v->visit(this);
}
};
注意:
我必须添加友元类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
关于c++ - 仅 header 环境中 C++ 中的访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58696015/