我有一个 Node 类和一个 Edge 结构。 但是当在类之前编写结构时,结构会提示不知道什么是距离。 解决方法是一样的,当之后定义结构时,类会提示不知道什么是边( vector 的类型)。
//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
包含 Node
和 Node
包含 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
变成一个指针。)
关于c++ - 具有结构 vector 的类,其中包含相同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936386/