c++ - 代码组织
问题描述
我有这个访问者模式实现:
class Visitor {
public:
Visitor() {}
void visit(A *a){ a->doSomething(); }
void visit(B *b){ b->doSomething(); }
};
class Base {
public:
Base() {}
virtual void accept(Visitor *v) = 0;
};
class A: public Base {
public:
A():Base() {}
void accept(Visitor *v) override { v->visit(this) };
.....
};
class B: public Base {
public:
B():Base() {}
void accept(Visitor *v) override { v->visit(this) };
};
问题在于,A
并且B
在访问者实现中具有不完整的类型。但我不想将实现放在单独的源文件中。
有没有办法把它放在一个头文件中?
解决方案
做前向声明A
和B
. 将您的visit(A*a);
andvisit(B*b);
移到访问者的类声明之外,并在A
和B
类之后声明它。为避免重复符号,将其放入头文件,例如 Header.h:
//forward declarations
class A;
class B;
class Visitor {
public:
Visitor() {}
void visit(A *a);
void visit(B *b);
};
class Base {
public:
Base() {}
virtual void accept(Visitor *v) = 0;
};
class A: public Base {
public:
A():Base() {}
void accept(Visitor *v) override { v->visit(this); };
void doSomething(){};
};
class B: public Base {
public:
B():Base() {}
void accept(Visitor *v) override { v->visit(this); };
void doSomething(){};
};
此声明应放在 cpp 文件中,以避免重复符号,例如将其添加到 main.cpp:
#include "Header.h"
//outside declarations of methods
void Visitor::visit(A *a){ a->doSomething(); }
void Visitor::visit(B *b){ b->doSomething(); }
推荐阅读
- go - Golang TCP 服务器:如何编写 HTTP2 数据
- javascript - Js检查窗口是否被缩小或屏幕被锁定
- list - 如何用颤振在listTile中制作控件
- scikit-learn - Jupyter Notebook ModuleNotFoundError:没有名为“sklearn.impute”的模块
- python - 仅将填充列表传递给 for 循环
- python - Django API 在请求时引发错误“没有这样的文件或目录:'manage.py'”
- python - 有没有办法在 python 中打开 .wmf 文件?
- c++ - 顺序容器和迭代器算术
- php - 我可以将我的 cPanel 设置为在我的 WP 管理区域尝试一定数量的登录尝试后禁止特定的 IP 地址吗?
- css - 检查 facebook 图像时奇怪的 CSS 背景图像 url