OOP类定义的问题

时间:2010-04-30 04:28:40

标签: c++ oop class

我在C ++中为我的作业工作,我在定义多重方面遇到了一些问题。

我的图表类;

 class Graph{

     private:
          string name;                          //Graph name
          fstream* graphFile;                   //Graph's file

  protected:
    string opBuf;                         //Operations buffer
          int containsNode(string);             //Query if a node is present    
          Node* nodes;                          //Nodes in the graph
          int nofNodes;                         //Number of nodes in the graph

  public:
          static int nOfGraphs;                 //Number of graphs produced

          Graph();                              //Constructors and destructor
          Graph(int);
          Graph(string);
          Graph(const Graph &);
          ~Graph();

          string getGraphName();                //Get graph name
          bool addNode(string);                 //add a node to the graph
          bool deleteNode(string);              //delete a node from the graph
          bool addEdge(string,string);          //add an edge to the graph
          bool deleteEdge(string,string);       //delete an edge from the graph
          void intersect(const Graph&);         //intersect the graph with the <par>
          void unite(const Graph&);             //intersect the graph with the <par>
          string toString();                    //get string representation of the graph
       void acceptTraverse(BreadthFirst*);
    void acceptTraverse(DepthFirst *);


};

和我的遍历课程;

 class Traversal {
public:
 string *visitedNodes;

 virtual string traverse (const Graph & );
};

class BreadthFirst  : public Traversal {
public :
 BreadthFirst();
 string traverse();
};

class DepthFirst : public Traversal {
public :
 DepthFirst();
 string traverse();
};

我的问题是在遍历类中,我需要同时声明Graph类,在图类中我需要遍历类来声明。

我的问题很严重:)你能帮我吗?

4 个答案:

答案 0 :(得分:2)

前向声明会有所帮助,只需要做一下acceptTraverse(Traversal *),Visitor Pattern就可以帮到你了。

答案 1 :(得分:1)

如果我理解的话,我试过这个;

图表类中,在我添加的图表类减数之前

class BreadthFirst;
class DepthFirst;

并在 traversal.cpp 文件中使用了这个;

#include "Graph.h"
#include "Traversal.h"

有了这个,现在解决了很多问题;

  

错误8错误LNK2001:   未解决的外部符号“public:   虚拟课   的std :: basic_string的,类   std :: allocator&gt; __thiscall   遍历::遍历(类图const   &安培)”   (?横动@ @@遍历UAE?AV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ ABVGraph @@@ Z)   &安培; NBSP; C:\用户\ OBEN   isik \ documents \ visual studio   2010 \项目\ HW2 \ HW2 \ main.obj

     

错误9错误LNK1120:1   未解析的外部c:\ users \ oben   isik \ documents \ visual studio   2010 \ Projects \ hw2 \ Debug \ hw2.exe 1

我现在能做什么?

答案 2 :(得分:0)

不,您不需要类的定义。您只需要向GraphTraversal为类的编译器提供提示。因此,在class BreadthFirst;的定义中使用forward declartion之类的Graph(我就在类{...}}之上。类似地,在遍历类的定义之前使用class Graph;

答案 3 :(得分:0)

在其中一个之前预先声明你的类,例如在Traversal头文件中,在遍历类之前你需要一个语句

类图;

然后它会知道Graph类将存在于某个时刻