gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:03:03 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com