我有以下代码:
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。我该如何解决这个问题?
答案 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相比,它应该处于更高的水平。