微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我对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变成了空指针。这意味着下一条语句将取消引用该空指针,并导致未定义行为和可能的崩溃。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。