【发布时间】:2017-05-30 21:14:44
【问题描述】:
在 C++ 中尝试访问者模式时,我遇到了一个关于实现派生接口的愚蠢问题。我怀疑我不知道如何正确地提出这个问题,因为我在其他地方没有找到解决方案。
我有以下基本结构:
struct Visitor {
virtual void visit(const Resources) = 0;
virtual void visit(const Population) = 0;
};
我希望声明一些访客的具体实现以及一些额外的功能。 这就是我希望声明的样子:
struct EndVisitor : public Visitor{
virtual bool hasEnded();
};
struct SetupVisitor : public Visitor{
};
struct ScoreVisitor : public Visitor{
virtual unsigned int getScore();
};
在定义例如 ScoreVisitor 时,IDE 和编译器会识别 ScoreVisitor 中的额外函数声明:
unsigned int ScoreVisitor::getScore() {
return total;
}
但是,编译器或 IDE (Funtion 'visit' not declared in class 'ScoreVisitor') 无法识别实现访问者函数:
void ScoreVisitor::visit(const Resources resources) {
total += resources.score;
}
void ScoreVisitor::visit(const Population population) {
total += population.score;
}
如果我声明 ScoreVisitor 重复访问者函数,代码会编译,但是这会在访问者的所有专门声明中留下大量复制粘贴的代码,我希望避免这种情况。 这不是我希望声明的样子:
struct ScoreVisitor : public Visitor{
virtual void visit(const Resources);
virtual void visit(const Population);
virtual unsigned int getScore();
};
如何声明特定版本的访问者,而无需复制粘贴访问者已声明的所有功能?
【问题讨论】:
-
欢迎使用 C++!在定义它们之前,您需要正确声明任何类的所有成员。甚至是您从基类覆盖的虚拟方法。
-
谢谢尼姆!您的回复我理解为:我将无法避免在访问者的专门声明中声明接口函数?
-
是的,除非您有一个层次结构,其中某些功能在不同的抽象级别上实现..
-
好的,这回答了我的问题。你会用你的 cmets 提供的信息来回答这个问题吗?重要的细节是我正在尝试的事情是不可能的。
标签: c++ struct visitor-pattern