在C++中對訪問者模式進行實驗後,就實現派生接口而言,我遇到了一個愚蠢的問題。我懷疑我不知道如何正確地提出問題,因爲我還沒有在其他地方找到解決方案。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重複訪問者功能,代碼將會編譯,但是這使我在Visitor的所有專門聲明中留下了大量的複製粘貼代碼,我希望避免這些代碼。 這不是我多麼希望我的聲明看起來像:
struct ScoreVisitor : public Visitor{
virtual void visit(const Resources);
virtual void visit(const Population);
virtual unsigned int getScore();
};
我如何申報觀衆的專門版本,而不必複製粘貼所有遊客已經聲明瞭功能?
歡迎來到C++!在定義它們之前,您需要正確聲明任何類的所有成員。即使你從基類重寫的虛擬方法。 – Nim
謝謝Nim!我理解你的答覆如下:我無法避免在Visitor的專門聲明中聲明接口函數? – Yakitawa
是的,除非你有一個層次結構,其中一些功能是在不同的抽象層次實現的。 – Nim