[英]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();
};
当我尝试编译时,编译器声称OriginNode
和TargetNode
类型不完整。 我已经转发了该节点。 我该如何解决?
您不能不提供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.