c++ - 仅 header 环境中 C++ 中的访问者模式

标签 c++ oop header-only

我目前在实现 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);
    }
};

Live Demo on coliru

注意:

我必须添加友元类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/

相关文章:

c++ - 为什么具有虚函数的类与没有虚函数的类对齐方式不同?

javascript - 在 Javascript 中设置属性的默认值

c++ - 用 C++ 实现一副纸牌

c++ - 内联函数编译

c++ - 仅 header 库中的 "Does not name a type"

.net - 从 IUnknown 实现接口(interface)类时出现错误 c2259

c++ - 使用其他文件构建 gcc 插件

c++ - 仅 header 库设计 - 包含指令

c++ - 语法错误? C++中的运算符

java - 如何在调用方法时绕过java中的继承