C++、嵌套类、交叉引用

问题描述

上周,我正在做作业,要求我们实现一个有向图数据结构。我决定将我的图实现为邻接表。在图片下方,您可以看到我的想法。

İmage 1

为了实现这个结构,我创建了两个嵌套结构。 CityListNode 和 RouteListNode。 (在作业中,我们正在为一家航空公司构建一个软件)在这个实现中,顶点被实现为一个链表,顶点之间的每条边也是一个链表。当我尝试在每条边上使用一个指针指向边连接的顶点时,由于交叉引用,我开始面临错误。您可以在下面看到类声明的简化版本。有没有办法解决这个错误?我应该总是远离交叉引用吗?您将如何实现两个相互指向彼此的不同节点? 提前致谢:)

class AirlineGraph{
private:
    class routeListNode{
        public:
            cityListNode* destination;
            routeListNode *next;   
    };
    class cityListNode{
        public:
            string cityName;
            int cityNumber;
            cityListNode *next;
            routeListNode *root;   
    };
    int numCity,numRoute;
    cityListNode* cityListRoot;
    ...
    ...
    ...
 };

解决方法

您真正想要的是前向声明,例如:

class AirlineGraph::cityListNode;

...但是,对于 C++ 中的嵌套类,您不能这样做。仅在全局或命名空间范围内的类。这是语言的缺陷。

这里唯一的解决方案是取消嵌套其中一个类,以便可以向前声明它,或者使用基/派​​生层次结构并向前声明基。

我可能只是取消嵌套类。这对我来说似乎是一个很好的解决方案。如果您愿意,可以将其全部放在一个命名空间中。

,

使用 std,您可以将代码简化为

class AirlineGraph{
private:
    class City{
    public:
        // forbid copy,as we use reference to city
        // and want to be sure to avoid possible relocation
        City(const City&) = delete;
        City operator=(const City&) = delete;

        std::string cityName;
        int cityNumber;
        std::vector<City*> dests; // observer pointer
    };
    std::vector<std::unique_ptr<City>> cities; // use pointer,// instead of by value,so pointer are still valid
                                               // after a resize.
};