带有vector的向量的类,它包含相同的类

时间:2012-01-20 03:24:25

标签: c++ class header struct

我有一个类Node和一个struct 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;

};

如何解决此错误? 谢谢。

2 个答案:

答案 0 :(得分: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
};

Herb Sutter的GotW #101描述了一种巧妙的解决方案,以干净和有吸引力的方式抽象出这种模式。

(或者你也可以将Edge::node变成指针。)

答案 1 :(得分:1)

您的定义是循环的:它会尝试将Node放在Edge内,并在Node内放置一个边矢量。你需要将其中一个作为指针,例如,像这样:

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

P.S。你在结构之后错过了一个分号。