错误C2027或C2029取决于定义顺序

时间:2018-07-23 13:36:26

标签: c++

我有一个“节点”类和一个“标记”结构。来自“节点”的对象具有结构“标记”的元素,而“标记”的对象具有类“节点”的元素。

struct Mark {
    int q;
    Nodes start;
};

class Nodes {
protected:
    string Node_Name;       
    Mark mark;  
};

问题出在以下错误:C2027(使用未定义的类型'type')或C2029(类节点)。 因此,我无法更改定义这些内容的位置,因为我会收到新的错误(例如,如果以前是C2029,则会出现C2027)。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这不起作用。如果每个节点都包含一个标记,并且每个标记都包含一个节点,那么您将拥有无休止的实例链。

您可能是说他们彼此有引用

如果是这样,则应使用pointer,最好使用smart pointer

即使那样,编译器也必须在解析之前知道类型是否存在,因此您需要使用forward declaration

class Nodes;

struct Mark {
    int q;
    Nodes* start;
};

class Nodes {
protected:
    string Node_Name;       
    Mark* mark;  
};

或者,使用智能指针 (您将需要检查所需的智能指针,我进行了有根据的猜测,并假设您需要共享的指针):

#include <memory>

class Nodes;

struct Mark {
    int q;
    std::shared_ptr<Nodes> start;
};

class Nodes {
protected:
    string Node_Name;       
    std::shared_ptr<Mark> mark;  
};