代码之家  ›  专栏  ›  技术社区  ›  David Gladfelter

C++中确保CURONE()的正确维护

  •  1
  • David Gladfelter  · 技术社区  · 14 年前

    在C++中,我发现将一个“克隆()”方法添加到类中是非常有用的,这些类是需要这样的签名(尤其是多态)重复的层次结构的一部分:

    class Foo {
    public:
    virtual Foo* Clone() const;
    };
    

    这看起来很不错,但很容易出现由类维护引入的bug。每当有人向这个类添加数据成员时,他们必须记住更新Clone()方法。失败往往导致细微的错误。单元测试不会找到错误,除非它们被更新,或者类有一个相等比较方法,并且该方法是单元测试的,并且被更新以比较新成员。维护人员不会得到编译器错误。Clone()方法看起来是通用的,很容易忽略。

    是否有其他人因为这个原因对Clone()有问题?我倾向于在类的头文件中添加注释,提醒维护人员在添加数据成员时更新Clone。有更好的办法吗?插入一个#if/etc.指令来查找类大小的更改并报告警告/错误是愚蠢的/迂腐的吗?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Puppy    14 年前

    为什么不直接使用复制构造函数呢?

    virtual Foo* Clone() const { return new Foo(*this); }
    

    编辑: 等等,Foo是基类,而不是派生类吗?同样的原则。

    virtual Foo* Clone() const { return new MyFavouriteDerived(*this); }
    

        2
  •  1
  •   Edward Strange    14 年前

    好吧,这个问题把我搞糊涂了。一开始我以为你想自动创建clone(),然后我会引导你去一个 discussion I was in a couple years back .

    但是…这似乎不是你想要的。所以我来谈谈你的假设:

    每当有人向这个类添加数据成员时,他们必须记住更新Clone()方法。

    struct X { X* clone() const { return new X(*this); } };
    

    单元测试不会找到错误,除非它们被更新,或者类有一个相等比较方法,并且该方法是单元测试的,并且被更新以比较新成员。

    是否有其他人因为这个原因对Clone()有问题?

    不,我可以肯定地说,我从来没有遇到过你在克隆()方面的特殊问题。