【问题标题】:How to create deep copy constructor?如何创建深拷贝构造函数?
【发布时间】:2020-07-01 22:51:29
【问题描述】:

我有这段代码,我必须为它创建一个复制构造函数来创建传递对象的深层副本。我该如何创建它?

template<typename T>
class SSL {
    struct Node {
        T data;
        Node* next;
    };
    Node* head = nullptr;
public:
    // ...
};

【问题讨论】:

  • 向我们展示您的尝试。
  • 你真的要复制一个节点,包括指针吗?您将拥有两个具有相同指针的对象(即两个数据的链接指向同一个下一个节点)。
  • 对于链表结构,您必须制作节点的新副本并重新链接它们,以便复制的节点独立于原始节点。
  • 在任何地方使用std::unique_ptr&lt;Node&gt; 而不是Node* 来帮助自动销毁。这也将使隐式定义的移动操作格式正确且正确,只留下复制操作供您实现。
  • 我认为对于一个 SLL 对象中的所有节点,T 必须是相同的类型。那么,为什么不对同一类型的多个元素使用 STL 容器呢?

标签: c++ c++11 visual-c++ c++14


【解决方案1】:

您只需要迭代源对象的列表,创建具有其数据副本的新节点,例如:

template <typename T>
class SSL {
    struct Node {
        T data;
        Node* next = nullptr;
        Node(const T &value) : data(value) {}
    };

    Node* head = nullptr;

public:
    // ...

    SSL() = default;

    SSL(const SSL &src) {
        Node **n = &head;
        for (Node *cur = src.head; cur; cur = cur->next) {
            *n = new Node{cur->data};
            n = &(n->next);
        }
    }

    SSL(SSL &&src) : head(src.head) {
        src.head = nullptr;
    };

    ~SSL() {
        Node *cur = head;
        while (cur) {
            Node *n = cur;
            cur = cur->next;
            delete n;
        }
    }

    SSL& operator=(SSL rhs) {
        std::swap(head, rhs.head);
        return *this;
    }

    // ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2013-03-09
    • 2013-03-19
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多