语法错误:标识符'Edge'?

时间:2010-10-22 21:02:31

标签: c++ scope

在构造函数Node = new Node [Number of Nodes];和Edge = new Edge [numberOfEdges];给出标识符错误?它有什么问题?

typedef struct node
{
 int id;
 int x;
 int y;
} Node;

typedef struct edge
{
 int id;
 Node node1;
 Node node2;
} Edge;

class graph
{
private:
 int numberOfNodes;
 int numberOfEdges;
 int *Node;
 int *Edge;

public:
 graph(int nodes, int edges)
 {
  numberOfNodes = nodes;
  numberOfEdges = edges;
  Node = new Node[numberOfNodes];
  Edge = new Edge[numberOfEdges];
 }

4 个答案:

答案 0 :(得分:2)

您有各种变量名称冲突,包括变量声明int* Node与typedef Node之间的冲突。此外,如果节点数组应为类型int*,则将其声明为类型Node*。您对Edge执行相同的操作。请尝试以下方法:

class graph
{
    private:
    int numberOfNodes;
    int numberOfEdges;
    Node* nodes_;
    Edge* edges_;

    public:

    graph(int num_nodes, int num_edges)
    {
        numberOfNodes = num_nodes;
        numberOfEdges = num_edges;
        nodes_ = new Node[numberOfNodes];
        edges_ = new Edge[numberOfEdges];
    }
};

另外,仅仅是为了将来,在C ++中真的没有typedef struct { }成语。它的主要目的是让C程序员不必经常使用单词struct作为结构变量的前缀。但是在C ++中这没有必要,所以当你只能说typedef struct node { ... } Node;时,通常没有理由说struct Node { ... };。有关详细信息,请参阅here

答案 1 :(得分:0)

在您的构造函数中,NodeEdge引用该类的int*成员,全局范围内的类型名称。您必须表明您指的是全局类型:

Node = new ::Node[numberOfNodes];
Edge = new ::Edge[numberOfEdges];

编辑:当然,这仍然会让人类读者感到困惑。为了您的读者,建议将类型和变量名称分开。

答案 2 :(得分:0)

编译器对于您使用NodeEdge作为类型标识符(在typedef ... Node;中)和作为类成员(int *Node)这一事实感到困惑。我也困惑了一会儿。你真的不能这样做。一般来说,为类型,成员和变量选择不同的名称是个好主意。

答案 3 :(得分:0)

对不起,我写了无意义的东西..就是这样。但是我仍然得到了错误: Eerror C2440:'=':无法从'Edge *'转换为'int'

public:
    graph(int nodes, int edges)
    {
        numberOfNodes = nodes;
        numberOfEdges = edges;
        nodes = new Node[numberOfNodes];
        edges = new Edge[numberOfEdges];
    }