2017-01-06 4 views
2

Вопрос о включении структуры typedef (или, по крайней мере, я думаю, что это так). Это, наверное, глупо, но я не мог понять, что не так с моим кодом.C++ - включение структуры typedef изнутри класса

У меня есть Node.h заголовок, объявляющий класс Node:

class Node { 
public: 
    Node(/*some parameters*/); // Class constructor 

    typedef struct{ // This represents a weighted edge of weight "weight" from the current node to another node "node" 
     Node* node; 
     double weight; 
    }EdgeInfo; 

    vector<EdgeInfo*> OutEdges; // This vector represents the outgoing weighted edges from this node 
}; 

Так я понял, что это единственное место в моем коде я могу объявить struct, потому что это единственное место, где я могу объявить EdgeInfo, что " знает ", что такое объект класса Node.

Тогда у меня есть заголовок Graph.h, в том числе файл Node.h, который объявляет класс Graph.

Теперь в файле Graph.cpp я реализовать функцию, которая закругляется на всех исходящих ребер Node, более или менее, как это:

Node* current = /*passing an object of class Node*/ 

for(EdgeInfo* out : current->OutEdges){   
    /*working on the edges*/ 
} 

Проблема заключается в том, что при компиляции я получаю ошибку error: ‘EdgeInfo’ was not declared in this scope в цикле for.

Как вы, наверное, видите, я как бы новичок C++. Я думал, что включив Node.h, я мог бы использовать определения'typedef struct` внутри класса так же, как я использую переменные и функции. Я ошибаюсь? Или я не понял, как включает работу на C++?

Надеюсь, я не пропустил никаких подробностей. Большое вам спасибо за помощь!

+2

'Узел :: EdgeInfo'. Но почему вы используете 'typedef' в этом пункте? Они не нужны в C++ (обычно в этом контексте). – Zeta

+0

@Zeta Почему? Что бы вы сделали вместо этого? – jackscorrow

+1

@Tommaso Scarpa В C++ вам не нужно использовать ключевое слово 'typedef' для объявления' struct' или 'class'. Это действительно, но не обязательно. Вы можете просто объявить свою 'struct', выполнив:' struct S {int a; }; 'И вы объявляете экземпляр' struct S', делая: 'S s; sa = 10' – nikau6

ответ

2

«Так я понял, что это единственное место в моем коде, я могу объявить-структуру, потому что это единственное место, где я могу объявить EdgeInfo, что„знает“, что объект класса Node является.»

Вы может использовать forward declaration. Еще одна ссылка: forward declaration, stackoverflow.

class Node; // forward declaration 

struct EdgeInfo 
{ 
    Node* node; // now, `EdgeInfo` knows that a class named `Node` is defined somewhere. 
    double weight; 
}; 

class Node { 
public: 
    Node(/*some parameters*/); // Class constructor 

    vector<EdgeInfo*> OutEdges; // This vector represents the outgoing weighted edges from this node 
}; 

Теперь, когда вы включаете node.h в graph.cpp или Graph.h, он будет знать о EdgeInfo.