在C ++中使用抽象类作为函数的参数

时间:2014-05-31 11:17:43

标签: c++ class abstract

我有一个简单的界面,为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
}

因为我无法使用抽象类的引用,只能使用指针这个代码。工作

2 个答案:

答案 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
 }