繁体   English   中英

C ++继承和复制构造函数,适用于非平凡的类(深复制)

[英]C++ Inheritance and copy constructors, for non-trivial classes (deep copy)

应MM的要求,我已重新发布了此问题。

这个问题是关于继承的,而不是YSC先前认为的3的规则。

我有一堂课(实际上是两堂)

class A
{
private: // [!] ?
    int *a;
public:
    A(const A& other) : a{new int[...]}
    {
        std::copy(...)
    }
}

class B : public A
{
private:
    int *b;
public:
    B(const B& other) : b{new int [...]}
    {
        std::copy(...)
    }
}

显然,这些是非平凡的类。 我们需要在复制构造函数中深度复制数据。

用法示例

int main()
{
    B binst;
    B binst2(binst); // [LABEL 1]
}

一个人如何为class B编写一个复制构造函数,以便将int *a的值正确复制到[LABEL 1]

有人提到了类之间的隐式类型转换。 但是我还不知道这到底意味着什么。 (如何进行隐式转换。)

我敢肯定这是一个简单的问题,但我似乎找不到答案。

在此设计中,副本构造函数为:

B(const B& other) : A(other), b{new int [...]}

您调用A的copy-constructor初始化此B对象的A成员。

注意:更好的设计是使每个资源管理对象都是独立的。 例如,如果B实际上有两个初始化为b{new int}, c{new int}指针成员b{new int}, c{new int}则您的代码无法从第二个new引发的异常中恢复。

例如:

struct IntManager
{
    int *i;
    // here put your copy-constructors etc. etc.
};

struct A
{
    IntManager a;
};

struct B : A
{
    IntManager b;
};

这称为零规则 您避免为A或B编写任何特殊功能(不是非复制/移动构造函数的构造函数)。 因此,您的代码将保持简单,并且无法将其弄错,并且您不会像AB示例中那样到处都有代码重复。

NB。 std::unique_ptr<int>可能会充当您需要int *来完成的角色,如果是这样,则可以使用它来避免重新发明轮子。 当指针具有所有权语义时,最好指出这一点。 原始指针仅应用于指向别人拥有的东西(即使那样,也要尽量避免使用它)。

暂无
暂无

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

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