2012-01-20 32 views
1

我有一个类Node和一个结构体Edge。 但是,当结构写在类之前时,结构抱怨不知道什么是距离。 在结构定义之后,Classe抱怨不知道什么是Edge(矢量的类型),这种情况也是一样的。包含相同类的结构向量的类

//This is my header file 

typedef struct Edge Edge; 
struct Edge{ 

    Node node; 
    int distance; 

}; 

class Node 
{ 

    private: 

    std::vector<Edge> vectorOfEdges; 

}; 

我该如何解决这个错误? 谢谢。

+0

什么背后'typedef结构封边你的想法;'? –

回答

1

您的定义是循环的:它试图将Node放在Edge之内,并且在Node之内的边缘向量。您需要制作其中一个指针,例如,如下所示:

class Node; 
struct Edge{ 
    Node *node; 
    int distance; 
}; 
class Node { 
private: 
    std::vector<Edge> vectorOfEdges; 
}; 

P.S.你在结构之后丢失了一个分号。

+0

对不起,你可以试试它,但它仍然说:../src/Node.h:22:error:field'node'有不完整的类型。 谢谢你试图帮助我! – inconnu26

+0

@ user1155340我修复了答案,看看更新后的版本是否有效。 – dasblinkenlight

+0

它确实有效!这是魔术! – inconnu26

2

如果你真的想保持原来的代码,那么没有办法解决这个问题:就标准而言,std::vector<T>可能包含T类型的元素,因此你有循环相互依赖关系Edge包含NodeNode包含Edge,这没有意义。

(实际的措辞是,在一个不完全类型实例化一个标准库容器模板是不确定的行为。)

解决这个问题的典型方法是PIMPL方法,通过它你只提供一个指针到元素:

struct Edge; 

class Node 
{ 
    std::unique_ptr<std::vector<Edge>> pVecImpl; 
public: 
    Node() : pVecImpl(::new std::vector<Edge>) { } 
    // ... 
}; 

struct Edge 
{ 
    // as before 
}; 

香草萨特的GotW #101描述了一个干净和有吸引力的方式很好地解决了这个抽象的图案。

(或者,您也可以让Edge::node成指针。)

相关问题