You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现A->*B->*C关联类拷贝构造深拷贝的代码正确性咨询

评审结论

你写的代码不符合任务要求,也无法实现正确的深拷贝逻辑,存在多处问题。

具体问题

  • 基础语法错误:三个类的定义结尾都没加分号,代码根本过不了编译。
  • 违反实现约定:任务明确说明不需要额外实现其他构造函数,你为类A、类B都编写了接收list参数的自定义构造,不符合要求。
  • 容器选型逻辑错误:你用存裸指针的std::list<T*>保存关联对象,就算把指针复制到新列表里,新旧对象还是指向同一块内存,本质是浅拷贝,后续要么修改一个对象另一个跟着联动变更,要么释放内存时出现重复释放的崩溃问题。
  • 深拷贝逻辑完全缺失:你写的类A拷贝构造仅复制了iA_成员,完全没有处理关联的B对象列表,拷贝出来的新A对象没有复制原对象关联的B、C对象,根本不满足拷贝需求。
  • 类B没有实现对应拷贝处理逻辑,就算A的列表完成复制,B下挂载的C对象也无法正确独立复制。

符合要求的实现方案

这个需求不需要手动编写任何自定义构造、析构函数,直接使用编译器默认生成的函数即可,合理性依据如下:

  • 类C仅包含int类型成员,没有任何需要特殊处理的资源,编译器默认生成的拷贝、析构逻辑完全正确。
  • 关联容器不要存指针,直接存储对象值:std::list本身的拷贝构造会自动把列表里的每个元素复制一份到新列表,复制过程会自动调用元素类型的拷贝构造:
    • 类B中存储std::list<C>,拷贝B的时候,列表里的所有C对象都会被复制为独立新实例,不存在多个B共享同一个C的问题
    • 类A中存储std::list<B>,拷贝A的时候,列表里的所有B对象都会被复制为独立新实例,每个B复制时又会自动复制自己持有的C对象,从A到B到C全链路都是独立对象,天然实现深拷贝
  • 因为所有成员都是值类型,没有裸指针指向堆内存,编译器默认生成的析构函数会自动正确释放所有资源,不需要手动实现。

最终符合要求的代码如下:

#include <list>

class C
{
private:
    int iC_;
};

class B
{
private:
    int iB_;
    std::list<C> CList_;
};

class A
{
private:
    int iA_;
    std::list<B> BList_;
};

内容的提问来源于stack exchange,提问作者FooStack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:01:07