Visitor-Pattern 在 Header-Only 环境中的 C++ 中
Visitor-Pattern in C++ in a Header-Only Environment
我目前无法在 C++ 的 Header-Only 库中实现 Visitor-Pattern。
考虑以下 class 应该支持访问者访问(为简单起见没有界面):
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。由于 headers 都受到 Include-Guards 的保护,后一个将失败。使用前向声明也不能解决问题。
对于Visitor
,一个不完整的Acceptor
类型(又名class Acceptor;
)就足够了。因此,您可以通过在 Acceptor
中包含 Visitor
来打破循环 #include
s,反之亦然。
为了证明这一点,我制作了一个文件-MCVE:
class Acceptor;
class Visitor
{
friend class Acceptor;
virtual void visit(Acceptor* t) = 0;
};
class Acceptor
{
void accept(Visitor* v)
{
v->visit(this);
}
};
注:
我必须添加 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
我目前无法在 C++ 的 Header-Only 库中实现 Visitor-Pattern。
考虑以下 class 应该支持访问者访问(为简单起见没有界面):
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。由于 headers 都受到 Include-Guards 的保护,后一个将失败。使用前向声明也不能解决问题。
对于Visitor
,一个不完整的Acceptor
类型(又名class Acceptor;
)就足够了。因此,您可以通过在 Acceptor
中包含 Visitor
来打破循环 #include
s,反之亦然。
为了证明这一点,我制作了一个文件-MCVE:
class Acceptor;
class Visitor
{
friend class Acceptor;
virtual void visit(Acceptor* t) = 0;
};
class Acceptor
{
void accept(Visitor* v)
{
v->visit(this);
}
};
注:
我必须添加 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