繁体   English   中英

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

[英]Class forward declaration leads to incomplete type

我有以下代码:

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的完整定义。 您也可以将指针声明为成员: Node* OriginNode

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

使用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的值,您可以使用引用或指针代替(也许我是错的,我不知道您的所有要求。

您应该颠倒声明的顺序

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相比,它应该放置在更高的层次上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM