0

我正在尝试制作一个有向图,所以我制作了一个 Graph 类,它有一个私有边结构和一个私有节点结构。我希望我的边缘有一个节点成员,它是边缘指向的节点,并且我希望我的节点有一个远离它们的所有边缘的列表。

#ifndef DIRECTED_GRAPH_H 
#define DIRECTED_GRAPH_H

#include <iostream>
#include <vector>
#include <string>

class Graph {
public:
    Graph( const std::string & );
    ~Graph();

    void print();

private:
    struct GNode
    {
        std::string currency_type;
        std::vector<GEdge> edges; // line 19

        GNode( std::string name ) : currency_type( name ) {}
    };

    struct GEdge
    {
        int weight;
        GNode * node; // node that the edge is pointed towards

        GEdge( int weight, GNode* node ) : weight( weight ), node( node ) {}
    };

    GNode *source;
    std::vector<GNode> nodes; 

    void add_node( const std::string & currency );
    void add_edge( const GNode *& source, const GNode *& destination, int weight );
    std::string bellman_ford( const GNode *&source );
};

#include "directed_graph.cpp"

#endif

问题是,在这种情况下GNode,声明的第一个结构不知道GEdge存在导致编译器给我错误

directed_graph.h:19: error: ISO C++ forbids declaration of ‘vector’ with no type

我怎样才能解决这个问题?

4

2 回答 2

4

只需使用前向声明

class Graph {

    // ...

private:

    struct GEdge;
//  ^^^^^^^^^^^^^
//  Forward declaration for GEdge

    struct GNode
    {
        std::string currency_type;

        std::vector<GEdge> edges; // <== This is now OK because of the
                                  //     forward declaration above

        GNode( std::string name ) : currency_type( name ) {}
    };

    struct GEdge // <== Now comes the definition of GEdge
    {
        int weight;
        GNode * node; // node that the edge is pointed towards

        GEdge( int weight, GNode* node ) 
            : weight( weight ), node( node ) {}
    };

    // ...
};

这是上述代码编译的完整实时示例。

于 2013-05-12T23:59:17.957 回答
2

您正在将 a 嵌入GNode*到您的GEdge. 这不需要结构定义,结构指针都表示相同,因此编译器已经知道它需要的一切。您将完整GEdge的 s 嵌入(中的向量)您的GNode. 这在某个时候需要一个完整的结构定义,它的向量被延迟,但如果你决定切换到std::array<>它,如果 GEdge 尚未定义,它将失败。

交换定义顺序并添加前向声明:

#include <vector>
struct GNode;
struct GEdge { GNode *n; };
struct GNode { std::vector<GEdge> e; };

即使您没有从vector<GEdge>堆分配的延迟构造中获得帮助,这也具有工作的优势:

struct GNode;
Struct GEdge { GNode *n; };
struct GNode { GEdge e; };

我只是反射性地向前 decare 结构,无论如何它对我有帮助。

于 2013-05-13T00:14:44.047 回答