我目前在 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/

10-10 22:29