我有一个简单的界面,为DFS中的图形提供访客模式
class DFSVisitor {
public:
virtual void enterVertex(DirectedGraph::VertexIndex vertex) = 0;
virtual void leaveVertex(DirectedGraph::VertexIndex vertex) = 0;
virtual void checkEdge(DirectedGraph::VertexIndex vertex, DirectedGraph::VertexIndex to) = 0;
};
我得到了使用上述类的实例的函数:
void dfs(VertexIndex vertex, std::vector<bool>& used, DFSVisitor& visitor) const {
//some code
}
问题在于我收到编译时错误:
error c2259 cannot instantiate abstract class
我知道我可以在这个类中加入一些简单的实现,即使是空体也会有所帮助,但由于审查条件,我需要将这个类抽象化。
那我怎么能避免这个问题呢?
更新 VertexIndex代码:
typedef size_t VertexIndex;
添加以澄清上面的代码。
更新 感谢大家,我认识到了这个问题。 在函数定义中,我只需要从引用更改为指针
void dfs(VertexIndex vertex, std::vector<bool>& used, DFSVisitor* visitor) const {
//some code
}
因为我无法使用抽象类的引用,只能使用指针这个代码。工作
答案 0 :(得分:2)
您似乎正在通过值传递VertexIndex
,这涉及对象构造。由于课程是抽象的,所以你不能这样做。
通过引用传递它,它应该可以正常工作。
答案 1 :(得分:1)
我知道我可以在这个课程中加入一些简单的实现......
您始终可以使用对抽象类(DFSVisitor
)的引用,但是您无法创建该抽象类的实例。
为实例提供带有实现的派生类
class SomeVisitor : public DFSVisitor {
public:
virtual void enterVertex(DirectedGraph::VertexIndex vertex) {
// Your implementation ...
}
virtual void leaveVertex(DirectedGraph::VertexIndex vertex) {
// Your implementation ...
}
virtual void checkEdge
( DirectedGraph::VertexIndex vertex
, DirectedGraph::VertexIndex to
) {
// Your implementation ...
}
};
要将它传递给dfs()
函数,请编写一些代码,如
SomeVisitor visitor;
std::vector<bool> used;
dfs(5,used,visitor);
至于你的评论中的问题如何使实现类抽象
class SomeVisitor : public DFSVisitor {
protected:
SomeVisitor() {} // <<< Force this class to be used from inherited classes
// only.
};
并将该实例传递给dfs()
函数调用,但我怀疑这是您的审稿人的意思。通过DFSVisitor
抽象类,您可以很好地满足此要求。
注意实现dfs()
方法,不要尝试创建抽象类的值对象,例如
void dfs
( VertexIndex vertex
, std::vector<bool>& used
, DFSVisitor& visitor) const {
//some code
DFSVisitor tempVisitor1 = visitor; // Such will lead to a compiler error
// as you have
// Use a reference instead
DFSVisitor& tempVisitor2 = visitor; // Compiles fine
}