繁体   English   中英

c ++ copy constructor - 除了一个字段之外的所有字段的隐式副本?

[英]c++ copy constructor - implicit copy for all but one field?

Supose我有一个包含许多字段的类,和/或不断变化(在开发中),并且它的所有字段都是本机或不一定是POD类型,它们提供了令人满意的复制构造函数, 但是一个 - 它甚至可能具有删除或私有化其复制构造函数,但为我提供了根据需要进行复制的方法。
现在假设我需要它拥有自己的拷贝构造函数。
我是否必须通过字段副本编写详尽(耗费)字段,或者是否有更清洁,更少暴露于错误的方法来实现相同的目标?

插图代码:

class Big {
public :
  Big(Big const & big) : ? { ? }
protected :
  int i1, i2, ... , i50;
  float f1, f2, ... , f50;
  CopyConstructableClass1 c1;
  CopyConstructableClass2 c2;
  ...
  CopyConstructableClass20 c20;
  NonCopyConstructableClass ncc;
};

谢谢

你可以把讨厌的类包装成你自己设计的一个可识别的可复制类,然后让你的大变化类中的字段成为包装类型而不是原始类型。 这样,您只需要在一个地方完成“自定义复制”的工作,然后您可以在其他地方重用该逻辑。

这遵循单一责任原则 ,该原则规定每个班级应该只有一个责任,复杂性是由构成构建的。

通常我在这种情况下做的是把所有可以复制自己的字段放到基类中。 比我只有一个字段的派生类,将手动复制。

为了强调这个基类不能单独使用的事实,谨慎地标记它的析构函数是protected 实际上,它的所有成员都可以。

考虑一些会跳过赋值运算符逻辑的东西。 作为一个例子(不是真正的代码):

template <typename T>
class DontCopyThisField : public T
{
public:
    template <typename... Args>
    DontCopyThisField(Args&&... args):
        T(std::forward<Args>(args)...)
    {
    }

    DontCopyThisField(const DontCopyThisField& from)
    {
    }

    DontCopyThisField(DontCopyThisField&& from):
        T(static_cast<T&&>(from))
    {
    }

    DontCopyThisField& operator=(const T& from)
    {
        T::operator=(from);
        return *this;
    }

    DontCopyThisField& operator=(T&& from)
    {
        T::operator=(std::move(from));
        return *this;
    }

    DontCopyThisField& operator=(const DontCopyThisField& from)
    {
        return *this;
    }

    DontCopyThisField& operator=(DontCopyThisField&& from)
    {
        T::operator=(static_cast<T&&>(from));
        return *this;
    }
};

暂无
暂无

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

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