2010-10-22 4 views
0

У объекта consturctor Node = new Node [numberOfNodes]; и Edge = new Edge [numberOfEdges]; дает ошибку идентификатора? что в этом плохого?Ошибка синтаксиса: идентификатор 'Edge'?

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]; 
} 
+2

Почему структура ЬурейеЕ? Просто 'struct _name_ {_members_};' будет делать. – ergosys

ответ

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]; 
    } 
}; 

Кроме того, только в будущем, typedef struct { } идиомы действительно ненужная в C++. Основная цель заключалась в том, что программистам C не нужно было постоянно приписывать свои структурные переменные слову struct. Но в C++ это не обязательно, поэтому, как правило, нет реальной причины говорить typedef struct node { ... } Node;, когда вы можете просто сказать struct Node { ... };. См. here для получения дополнительной информации.

0

В конструкторе, Node и Edge относятся к int* членам класса, не имена типов в глобальном масштабе. Вы должны указать, что вы имеете в виду глобальных типов:

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

Edit: конечно, это было до сих пор путают человека читателей. Рекомендуется указывать названия типов и переменных для ваших читателей.

+3

Это сработает. Но на самом деле, не делай этого. – aschepler

0

Компилятор смущает тот факт, что вы использовали Node и Edge как в качестве идентификатора типа (в typedef ... Node;) и в качестве члена класса (int *Node). Некоторое время я тоже смущался. Вы не можете этого сделать. В общем, рекомендуется выбирать разные имена для типов, членов и переменных, которые должны быть разными.

0

Извините, что я написал бессмысленные вещи ... это было так. Однако я получаю еще erors: Eerror C2440: '=': не удается преобразовать из 'Край *' до '' междунар

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

Я видел свою ошибку. Спасибо за все ответы. – anarhikos

 Смежные вопросы

  • Нет связанных вопросов^_^