当前位置: 首页 > 面试题库 >

副本构造函数创建依赖副本

松铭
2023-03-14
问题内容

我实现了此处描述的副本构造函数。但是问题仍然是,当我更新时route_copy,会将相同的更新应用于route。所以,我不明白我的代码有什么问题?

public class Route implements Comparable<Route> {
    private List<Site> sites;

    public Route()
    {
        sites = new ArrayList<Site>();
    }

    public Route(List<Site> sites)
    {
        this.sites = sites;
    }

    /**
     * Copy constructor
     */
    public Route(Route r) {
        this(r.sites);
    }

    public void deleteSite(Site s) {
        this.sites.remove(s);
    }
}

public processData(Route route)
{
  Route route_copy = new Route(route);
  Site s = selectSite(route_copy);
  route_copy.deleteSite(s); // !!! now 'route' does not contain an  element 's'
}

问题答案:

在复制构造函数中,您只是在进行浅表复制,而您需要进行深表复制:

public Route(Route r) {
    this(r.sites);
}

在这里,您仍在复制的引用,该引用list仍指向same
ArrayList。您也应该对其进行修改以创建列表的副本。可能还需要像下面这样在arraylist中创建元素的副本:

public Route(Route r) {
    List<Site> newSites = new ArrayList<Site>();

    for (Site obj: r.sites) {
        // Add copy of obj to the newSites
        // So you need yet another copy constructor in 'Site' class.
    }

    this.sites = newSites;
}


 类似资料:
  • 问题内容: 如何构建接收另一个点(x,y)并复制其值的复制构造函数? 我决定签名:,但我不知道该写些什么… Point类看起来像: 我试过了: 但我几乎可以肯定我会做得更好。 n 问题答案: 不,您的尝试 绝对没问题…(我已经更正了参数类型。) 我很想进行make 和final的操作,并且使该类final的操作,但这是因为我喜欢不可变的类型。其他人肯定有不同意见:) 在继承层次结构上进行克隆比较棘

  • 此程序成功编译并显示以下输出。 问题 a)我不明白为什么alpha的构造函数没有首先被执行。 我相信“super()”会首先被每个子构造函数隐式调用...对吗?。 b)如果beta的构造函数已经执行,那么为什么打印“5”?(输出中的第二行) 第三行我有点理解(即alpha自己的变量将显示出来,因为还没有对“a”实例变量进行强制转换)

  • 问题内容: 是否有可能创建python函数的真实副本?最明显的选择是http://docs.python.org/2/library/copy.html,但我在这里看到: 它通过不变地返回原始对象来“复制”函数和类(浅层和深层)。 我需要一个真实的副本,因为我可能会更改函数的某些属性。 更新: 我知道评论中提到的所有可能性。我的用例基于元编程,其中我根据一些声明性规范构造了类。完整的细节对于SO来

  • 我想知道以下解决方案之间的区别是什么,为什么使用解决方案2?有什么好处吗? 解决方案一: 解决方案2:

  • 我有一个数组,我需要用map函数循环,并像

  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?