代码之家  ›  专栏  ›  技术社区  ›  nurgan

C++“纯虚方法调用”,使用抽象基类[复制]

  •  3
  • nurgan  · 技术社区  · 8 年前

    就我的研究而言,这似乎是一条路要走。

    我必须抽象基类、GraphReader和Graph。

    class Graph{
       public:
       Graph() {};
       virtual ~Graph() {};
       virtual void layout() = 0;
       virtual std::vector<std::shared_ptr<Node>> getNodes() = 0;
       virtual std::vector<std::shared_ptr<Edge>> getEdges() = 0;
    
       protected:
    
    };
    
    class GraphReader{
       public:
       GraphReader(std::string fileName_) :
             fileName(fileName_) {};
       virtual ~GraphReader() {};
       virtual Graph* read() = 0;
    
       protected:
       std::string fileName;
    };
    

    class OgdfGraph : public Graph{
       public:
       OgdfGraph();
       virtual ~OgdfGraph();
       void setOgdfGraph(ogdf::Graph &oGraph);
       std::vector<std::shared_ptr<Node>> getNodes();
       std::vector<std::shared_ptr<Edge>> getEdges();
       void layout();
    
       private:
       [...]
    
    };
    
    class OgdfGmlReader : public GraphReader {  
       public:
       OgdfGmlReader(std::string fileName);
       virtual ~OgdfGmlReader();
       Graph* read();    
    };
    

    Graph* OgdfGmlReader::read() {
    
       [...]
    
       OgdfGraph og;
       og.setOgdfGraph(G);
       Graph* graph = &og;
    
       return graph;
    }
    

    我主要做以下几点:

       OgdfGmlReader tr = OgdfGmlReader("../data/lesmiserables.gml");
       GraphReader* gr = &tr;
       Graph* graph = gr->read();
    
       graph->layout();
    

    图形的加载工作正常,但当我在图形上调用layout函数时,会出现以下错误(在运行时,它会编译):

    pure virtual method called
    terminate called without an active exception
    Aborted (core dumped)
    

    我最困惑的是,它适用于GraphReader,但不适用于Graph(从GraphReader返回),因为这与我的理解完全相同。

    非常感谢您对如何解决这个问题(同时可能维护继承架构)的任何帮助!

    1 回复  |  直到 8 年前
        1
  •  5
  •   MKR    8 年前

    问题出在 Read

    OgdfGraph og graph 从读取函数返回。请注意,变量 og 将超出范围并删除一次 阅读 仍然只是指向图*的指针,没有分配任何有效实例。

    OgdfGraph og OgdfGraph* pog = new OgdfGraph()