繁体   English   中英

如何复制构造函数指针向量C ++

how to copy constructor pointer vector c++

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试为具有以下字段的“表”类创建副本构造函数:

private:
    int id ;
    int capacity;
    bool open;
    std::vector<Customer*> customersList;
    std::vector<OrderPair> orderList;

我想对所有字段进行深层复制,并且编写了以下代码,但由于其指针矢量,我不确定我是否对customersList进行了深层复制。 有人可以告诉我是否制作了深拷贝或浅拷贝? 先感谢您。

编码:

Table(const Table& t): capacity(t.getCapacity()), open(t.isOpen()), id(t.getId()){
    std::vector<Customer*> tmp(t.customersList);
    customersList = tmp;
}

或者,也许我过度复制了,我只应该这样做?

Table(const Table& t): customersList(t.customersList), capacity(t.getCapacity()), 
open(t.isOpen()), id(t.getId()){}

再次感谢!

4 个回复

有人可以告诉我是否制作了深拷贝或浅拷贝?

两者兼而有之...取决于您正在考虑的间接级别。

std::vector的副本构造函数执行深层复制。 即:向量customersList在原始对象,并且矢量customersList在构建的对象指的是不同的内部缓冲器。 如果将指针添加到一个,则该指针不会自动反映在另一个向量中。

但是,向量内的元素是指针。 指针具有相同的值,并且指向相同的Customer对象,并且没有复制任何Customer对象。 因此,副本很浅。


您显示的两个建议都具有相同的结果,但后者更好,因为它只对向量执行一个操作(复制构造),而不是对三个进行操作(成员的默认构造,局部的复制构造,成员的复制分配)。 如果功能正确,则更简单的方法是使用隐式生成的副本构造函数: Table(const Table& t) = default; 除了成员直接访问而不是通过成员函数访问之外,它的作用相同。

但是实际上,您需要考虑要复制的内容。 您是否需要Customer对象的副本? 然后,您确实需要一个自定义的复制构造函数,用于复制初始化这些Customer对象。 如果这样做,那么您可能应该使用智能指针的向量,而不是裸指针(假设您根本需要指针)。


我想创建另一个包含新指针的向量-新的内存分配,但数据相同。 换句话说,我想将数据复制到新的内存中,并将新的指针保存在customersList字段中。

在这种情况下,您的副本构造函数不会执行您想要的操作。 您有新的指针,这些指针没有新的值,也没有为客户对象分配内存(尽管向量有内存分配)。

我怎样才能做到这一点 ?

您可以编写一个循环,该循环遍历要复制的向量。 在循环中,您可以分配新的客户对象,并使用矢量所指向的对象进行复制初始化。 然后将新分配的指针插入正在构造的成员向量中。

请注意,在这种情况下,指针将归所有者所有。 您永远不应该拥有裸露的指针。 要再次重申:在这种情况下,您应该使用智能指针(假设您完全需要指针)。

您是否需要C ++ 98/03中的非多态答案。 它可以处理customersList中的某些指针可能不再指向任何地方。

Table(Table const &t) : id(t.id), capacity(t.capacity), open(t.open), orderList(t.orderList) {
    customersList.reserve(t.customersList.size());
    std::vector<Customer *>::const_iterator b = t.customersList.begin();
    std::vector<Customer *>::const_iterator const e = t.customersList.end();
    for (; b != e; ++b) {
        if (*b) {
            customersList.push_back(new Customer(**b));
        } else {
            customersList.resize(customersList.size() + 1);
        }
    }
}

std::vector<Customer*>表示它不拥有Customer对象,仅引用存在于其他位置的对象。 在这种情况下,您可以使用编译器生成的副本构造函数,该构造函数为您执行成员级(浅)复制。 例如:

Table(const Table& t) = default;

不,您尚未复制这些矢量元素所指向的内容。 如果我正确地猜到了您的要求,则需要继续进行“手动”操作:

Table(const Table& t): capacity(t.getCapacity()), open(t.isOpen()), id(t.getId()){
    customersList.reserve(t.customersList.size());
    for (const auto old : t.customersList)
       customersList.push_back(new Customer(*old));
}

如果Customer是继承层次结构的基础,则在每个派生类中都需要一个执行正确的newvirtual Customer* clone()成员函数,以避免切片。 如果不是,为什么还要存储指针呢? 而是存储值并为您自己避免整个麻烦。

顺便说一句,我希望您能够适当地管理这些指针的生命周期,包括delete 总体而言,如果您使用某种智能指针而不是Customer*通常会更好。

1 指针向量的C ++复制构造函数

我有一个类A ,该类具有一个指向向量指针的指针( current ),该向量包含一对整数和一个B类对象。 我需要能够为A类A对象创建副本,为此,我使用了Clone函数(请参见下面的代码)。 但是,当我使用此功能时,指针似乎指向相同的内存位置,而不是指向不同的位置。 我认为解决此问题的方法是 ...

3 C ++通过指针复制构造函数

您好,我想创建一个新的类变量,它是一个指针,并通过复制构造函数对其进行初始化。 虽然我知道复制构造函数是如何通过引用工作的,但是我不知道该怎么做。 你能帮助我吗? 例如,我有这个定义: 在另一个代码段中,我执行以下操作: 但我遇到了细分错误。 你能帮助我吗? 我也尝试过 ...

5 向量的复制构造函数 C++

所以我有这个类在我的头文件中代表矩阵。 我的问题是如何通过已经创建的矩阵来初始化我的 org_matrix 例如: 我可以定义该对象的复制构造函数吗? ...

2019-11-05 09:02:58 2 47   c++
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM