C++异常处理和智能指针

问题遇到的现象和发生背景

题目:某学院有若干学生班级和许多学生,还成立了数学建模集训队、ACM集训队等若干集训队,每个学生属于某个自然班,又可以加入若干集训队,请编写模拟程序,设计班级类、学生类、集训队类,用智能指针表示这些实体间的关系,测试建立若干班级、集训队、学生对象,最后,输出各班级学生名单、各集训队学生名单。程序不可造成信息冗余,每个学生信息对应一个学生实体,也不可造成内存泄露。

问题相关代码,请勿粘贴截图

/* 请在这里填写答案 /
int main(int argc, char
* argv)
{
int n;
cin >> n;
Class C1("210901"); // 班级
Group A1("ACM"); // ACM
Group M1("MTH"); // 数学建模

for(int i = 0; i < n; i++){
    Student s1;
    cin >> s1;
    C1.add(s1);    // 学生加入班级; 班级对学生对象进行托管 
}

try
{
    // 学生1:加入ACM 
    auto a1 = C1[0];    // 获得第一个学生的共享智能指针 
    A1.join(a1);        // 加入到ACM1 
    
    // 学生2:加入ACM和数据建模 
    auto a2 = C1[1];
    A1.join(a2);
    M1.join(a2); 
    
    // 学生3:加入ACM和数据建模 
    auto a3 = C1[2];
    A1.join(a3); 
    M1.join(a3);
}
catch(MyException ex){
    cout << ex.what() << endl; 
} 
catch(...){
    cout << "error" << endl;
}
    
// 在学生学号后加上其参加的集训队标记 
A1.label("A");
M1.label("M");
    

// 输出学生信息 
cout << C1 << endl;
cout << A1 << endl;
cout << M1 << endl; 

return 0;

}

运行结果及报错内容

输入:
3
001 ZHANG 21
002 SHAOX 22
003 CHENM 23

输出:
210901:
001A ZHANG 21
002AM SHAOX 22
003AM CHENM 23

ACM:
001A ZHANG 21
002AM SHAOX 22
003AM CHENM 23

MTH:
002AM SHAOX 22
003AM CHENM 23

我的解答思路和尝试过的方法
我想要达到的结果

班级里面的学生集合用shared_ptr,,,其他集训队的用weak_ptr