【发布时间】:2018-10-12 10:14:15
【问题描述】:
我有这个访问者模式实现:
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 在 Visitor 实现中的类型不完整。但我不想将实现放在单独的源文件中。
有没有办法把它放在一个单独的头文件中?
【问题讨论】:
-
"这是把它放在单个头文件中的一种方式吗?" 为什么要将实现放在头文件中?如果您将实现放入源文件 - 您不会遇到“不完整类型”的问题。
-
尝试前向声明。
-
@AlexeyUsachov 仍然不允许在头文件中实现此类方法。
a和b的类型不完整的问题暗示了方法调用的问题,而不是A和B的使用。据我所知,最终需要将 something 的实现移动到源文件中,并且没有纯标头实现的解决方案。
标签: c++ code-organization visitor-pattern