用包含同一类的struct的向量初始化

Class with vector of struct, which contains the same class

本文关键字:struct 向量 初始化 一类 包含同      更新时间:2023-10-16

我有一个类Node和一个结构Edge。但是,当结构在类之前编写时,结构会抱怨不知道距离是多少。反过来也是如此,当结构在后面定义时,类抱怨不知道什么是Edge(向量的类型)。

//This is my header file
typedef struct Edge Edge;
struct Edge{
   Node node;
   int distance;
};
class Node
{
  private:
  std::vector<Edge> vectorOfEdges;
};

如何避免此错误?非常感谢。

如果你真的想保持代码的原样,就没有办法解决这个问题:就标准而言,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设置为指针。)

您的定义是循环的:它试图将Node放入Edge中,并将边的向量放入Node中。例如,您需要将其中一个作为指针:

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

附言:结构后面缺少一个分号。