我对 C++ 比较陌生,并且面临循环依赖问题。有人可以帮我解决这个问题吗?

我有两个类(class):

class Vertex {
    string name;
    int distance;
    //Vertex path;
    int weight;
    bool known;
    list<Edge> edgeList;
    list<Vertex> adjVertexList;

public:
    Vertex();
    Vertex(string nm);
    virtual ~Vertex();
};

class Edge {
    Vertex target;
    int weight;

public:
    Edge();
    Edge(Vertex v, int w);
    virtual ~Edge();

    Vertex getTarget();
    void setTarget(Vertex target);
    int getWeight();
    void setWeight(int weight);
};

上面的代码给出了以下错误:
  • ‘Vertex’ 未命名类型
  • “顶点”尚未声明
  • 在“v”之前应为“)”

  • 我该如何解决这个问题?

    最佳答案

    您所需要的只是在 Edge 中使用之前预先声明 Vertex 类:

    class Edge;
    
    class Vertex {
        string name;
        int distance;
        ...
    };
    
    class Edge { ... };
    

    您不能放置 Vertex 类型的成员而不是 Vertex 本身的声明,因为 C++ 不允许递归类型。在 C++ 的语义中,这种类型的大小需要是无限的。

    当然,您可以在 Vertex 中放置指向 Vertex 的指针。

    实际上,在 Vertex 的边缘和邻接列表中,您想要的是指针,而不是对象的拷贝。因此,您的代码应该像下面一样修复(假设您使用 C++11,实际上您现在应该使用它):
    class Edge;
    
    class Vertex {
        string name;
        int distance;
        int weight;
        bool known;
        list<shared_ptr<Edge>> edgeList;
        list<shared_ptr<Vertex>> adjVertexList;
    
    public:
        Vertex();
        Vertex(const string & nm);
        virtual ~Vertex();
    };
    
    class Edge {
        Vertex target;
        int weight;
    
    public:
        Edge();
        Edge(const Vertex & v, int w);
        virtual ~Edge();
    
        Vertex getTarget();
        void setTarget(const Vertex & target);
        int getWeight();
        void setWeight(int weight);
    };
    

    关于c++ - C++ 类中的循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18938934/

    10-13 08:30