簡體   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