如何为两个在不同文件中相互引用的对象调用析构函数?

问题描述 投票:0回答:1

我有 2 个名为

student
course
的类,在单独的文件中有构造函数等:

//student.h
class course;
class student {
  public:
    ~Student();
  private:
    course *course_ref;
}

// student.cpp
student::~student() {delete [] course_ref ; course_ref = NULL;}

// course.h
class student;
class course {
  public:
    ~Course();
  private:
    student *student_ref;

//course.cpp
course::~course() { delete [] student_ref; student_ref = NULL;}


我想这与未定义的行为有关,编译器在销毁它之前需要知道类的主体,但我找不到办法做到这一点。类必须在不同的文件中,

*.h
*.cpp
, 有什么办法吗?

我试过将课程的析构函数放在 student.cpp 中,但它又不完全了解课程,所以出现错误。

c++ class c++11 destructor
1个回答
0
投票

你所拥有的称为循环引用。

您没有展示

student
course
如何开始实例化。您也没有说明学生和课程的实例是如何配对在一起的。所以我用一般的技术即兴表演:

简单的解决方案

简单的解决方案。从

delete course_ref
的析构函数中删除明确的
student
语句。然后当需要清理东西时,直接删除课程(从 main 或它超出范围的结果)并让它的析构函数删除你拥有的学生。您可以交换此逻辑,以便学生删除课程。

结构化解决方案

course.h
可以
#include "student.h"
并使用直接实例:

student.h

#pragma once

class course;

class student {
  public:
    ~Student();
  private:
    course *course_ref;
};

课程.h

#pragma once

#include "student.h"

class course {
  public:
    ~Course();
  private:
    student student_instance;
};

然后从两个析构函数中删除所有显式删除。当

course
实例超出范围时

现代解决方案

一个类有一个对另一个类的 shared_ptr 引用。另一个实例有一个 weak_ptr

© www.soinside.com 2019 - 2024. All rights reserved.