仅标题环境中C ++中的访问者模式

我目前在用C ++的仅标题的库中实现Visitor-Pattern时遇到麻烦。

考虑以下应支持访问者访问的类(没有接口可简化访问):

class acceptor
{
    void accept(Visitor* v)
    {
        v->visit(this);
    }
};

以下是访问者的界面:

class Visitor
{
    virtual void visit(acceptor* t) = 0;
};

在仅标头的库中,acceptor.hpp必须包含Visitor.hpp,Visitor.hpp必须包含acceptor.hpp。由于两个标头均受Include-Guards保护,因此后一个标头将失败。使用前向声明也无法解决问题。

Lee_Ryan 回答:仅标题环境中C ++中的访问者模式

对于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
本文链接:https://www.f2er.com/3165781.html

大家都在问