类前向声明​​导致类型不完整

时间:2014-02-25 10:19:31

标签: c++

我有以下代码:

class Node;

class Edge {
    public:
    //Edge(Node originnode,Node targetnode,int weight):OriginNode(originnode),TargetNode(targetnode),Weight(weight){};
    //~Edge(){};
    //Node getOriginNode() const { return OriginNode;};
    //Node getTargetNode() const { return TargetNode;};
    int getWeight() const { return Weight;};
    Node OriginNode;
    Node TargetNode;
    int Weight;
};

class Node{
    public:
    std::string getName();
    std::vector<Edge> getEdges();
};

当我尝试编译编译器声称OriginNodeTargetNode具有不完整类型时。我已经向前声明了Node。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

你不能不提供Node的完整定义。您也可以将指针声明为成员:Node* OriginNode

我建议你重新考虑你的设计 - Edge真的有一个Node。在 - 它是否拥有它的所有权?多个边缘之间不能共享Node吗?此外,Node真的是否包含多条边?

答案 1 :(得分:0)

使用boost :: container,您可以更改声明的顺序,因为它支持不完整类型的容器:

    class Edge;

class Node{
    public:
    std::string getName();
    boost::container::vector<Edge> getEdges();
};

class Edge {
    public:
    //Edge(Node originnode,Node targetnode,int weight):OriginNode(originnode),TargetNode(targetnode),Weight(weight){};
    //~Edge(){};
    //Node getOriginNode() const { return OriginNode;};
    //Node getTargetNode() const { return TargetNode;};
    int getWeight() const { return Weight;};
    Node OriginNode;
    Node TargetNode;
    int Weight;
};

顺便说一下,为什么在从Node获取Edge向量时要返回Edge向量的值,为什么要将OriginNode和TargetNode的值存储在边缘内,可以使用引用或指针代替(也许我错了,我不知道你的所有要求。)

答案 2 :(得分:0)

您应该颠倒声明的顺序

class Edge;

class Node{
    public:
    std::string getName();
    std::vector<Edge> getEdges();
};

class Edge {
    public:
    //Edge(Node originnode,Node targetnode,int weight):OriginNode(originnode),TargetNode(targetnode),Weight(weight){};
    //~Edge(){};
    //Node getOriginNode() const { return OriginNode;};
    //Node getTargetNode() const { return TargetNode;};
    int getWeight() const { return Weight;};
    Node OriginNode;
    Node TargetNode;
    int Weight;
};

尽管如此,我认为课程设计非常糟糕。 Node是一个原始实体,不应包含Edge矢量。 Node为什么要控制容器?!容器是比Node更高级的泛化。因此,与Node相比,它应该处于更高的水平。