【问题标题】:C++: How to Perform Deep Cloning of Generic TypeC++:如何执行泛型类型的深度克隆
【发布时间】:2009-11-28 06:39:20
【问题描述】:

长话短说,我无法使用 STL 和 boost 库中的容器,必须创建自己的容器。

我自己的泛型容器是用 VC++6 编写的,我需要知道如何在将泛型类型存储到我自己的容器之前手动为其分配内存。泛型类型都是可以包含嵌套结构的结构。所有结构,无论是否嵌套,都只包含原始类型,如 char*、int、bool 等。

例如,当您调用 std::vector 的插入函数时,在内部,std::vector 将在存储之前自动执行泛型类型的深度克隆。

如何在我自己的容器中复制此功能(泛型类型的深度克隆)?

请提供一些执行泛型深度克隆的示例代码。

【问题讨论】:

  • 搞笑:我发现自己赞成这个问题(这是一个关于 C++ 基础的好问题)和所有答案,因为每个答案都提供了独特的好信息。

标签: c++


【解决方案1】:

std::vector(和大多数 std 容器)只是调用类型的复制构造函数。这可能会也可能不会“深度克隆”对象,具体取决于复制构造函数的作用。

【讨论】:

    【解决方案2】:

    首先:如果你想克隆任何对象,它的所有聚合也应该被克隆。这意味着克隆操作中涉及的每个结构/类都应该实现克隆行为。

    然后:stl 使用所谓的值语义:容器将始终“按值”包含其元素。复制意味着创建所有容器元素的副本。

    所以为了实现克隆/深拷贝行为,容器元素类型的每个成员的拷贝构造函数都应该实现深拷贝行为。指向对象类型的成员也应该被深度复制(不仅仅是复制成员指针)。

    注意:代码未经测试,可能包含大量异常不安全等......并且仅用作浅表:)示例。

    struct WithPointer {
       int* pint; 
       WithPointer( int value = 0 ) : pint( new int ) { *pint = value; }
       WithPointer( const WithPointer& other ) {
         pint = new int;
         *pint = *other.pint;
       }
       ~WithPointer( ) { delete pint; } // important!
    }
    

    可以使用 stl 容器“深度复制”此类:

    std::vector<WithPointer> v;
    WithPointer wp(1);
    v.push_back( wp );
    
    std::vector<WithPointer> v2 = v;
    

    【讨论】:

      【解决方案3】:

      std::vector 本身不执行任何“深度克隆”。当您在std::vector 中插入某些内容时,向量会在适当的空间中为新元素分配原始内存,然后使用您传递给插入方法。换句话说,为了复制一个类类型,std::vector 调用类类型的复制构造函数。如果元素类型不是类类型或没有适当定义复制构造函数的类类型,则不会发生深复制。

      如果您想模拟std::vector 的复制功能,这就是您应该在您的容器类型中执行的操作。

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 1970-01-01
        • 2018-03-26
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 2012-02-19
        • 2012-03-30
        • 2017-09-17
        相关资源
        最近更新 更多