我有 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 中,但它又不完全了解课程,所以出现错误。
你所拥有的称为循环引用。
您没有展示
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