我可以对来自不同类的对象进行分组的方式有哪些?

问题描述

我对C ++比较陌生,自从上大学课程以来,我已经练习了一个月,我想扩展自己的知识并尽可能多地学习,以便编写出色的代码。我们有一个任务,我们应该创建三个类,在第三类中,我们应该编写第二类的对象并对其进行分组,然后对它们进行处理,换句话说,我们被要求创建一个名为pilot的类。 ,飞机,然后是由飞机组成的机队。老师们给出了这个解决方案,与我的设想相去甚远,看看:

class Fleet {
private:
    struct PlaneList {
        Plane* p;
        PlaneList* next;
PlaneList* node = nullptr,*next_node = nullptr;
public:
void PlaneAdd(Plane* current) {
        if (node == nullptr) {
            node = new PlaneList;
            node->p = current;
            node->next = nullptr;
            next_node = node;
        }
        else next_node->next = new PlaneList;
        next_node = node->next;
        next_node->p = current;
        next_node->next = nullptr;
    }
    };

现在,据我所知,我们创建了一个包含指针的列表,这些指针指向另一个类中的共同响应平面?另外,内存分配是很奇怪的,我不太了解,当我将此代码粘贴到MSVC中时,程序可以编译,但崩溃,并显示以下消息:next_node = node-> next;是NULLPTR且有访问冲突?为什么会出现此错误? 我完全感到困惑,如果您能向我解释一下,我将不胜感激。另外,我读到使用列表会严重影响性能,而使用向量等东西则效率更高。

解决方法

让我们使用您的PlaneAdd函数并将其重新格式化:

void PlaneAdd(Plane* current) {
    if (node == nullptr) {
        node = new PlaneList;
        node->p = current;
        node->next = nullptr;
        next_node = node;
    }
    else {
        next_node->next = new PlaneList;
    } 

    next_node = node->next;
    next_node->p = current;
    next_node->next = nullptr;
}

现在我们可以很容易地看到最后三个语句不属于else的一部分。

因此,当node == nullptrtrue时,执行这些语句时node->next将为空指针。而您要做的第一件事是next_node = node->next,它也将next_node变成了空指针。这意味着下一条语句将取消引用该空指针,并导致未定义行为和可能的崩溃。