【问题标题】:How to write copy constructor for Class with object of another class如何为具有另一个类的对象的类编写复制构造函数
【发布时间】:2018-05-23 03:02:28
【问题描述】:

我在编写这个相当简单的程序时遇到了麻烦。我有两个类 A 和 B。B 有一个 A 的对象。我需要编写 B 的 Copy 构造函数,以便 B 的两个实例将具有不同的 A 实例。有什么巧妙的方法可以做到这一点?要做的一件事是获取 parm 的所有成员变量,创建一个新的 A 对象并分配这些成员变量。但是如果这个类有更多的成员变量,那就是一个问题。这个怎么写的简单呢?

class A
{   
public:
    int data;
    A()
    {

    }
    A(int parm) : data(parm)
    {

    }

    A(const A&parm)
    {
        this->data = parm.data;
    }
    A& operator = (const A& parm)
    {
        if (this != &parm)
        {
            this->data = parm.data;
        }
        return *this;
    }
    ~A()
    {
        cout << "A is destroyed";
    }

};
class B
{
public:

    A *a;
    B() 
    {
        a = new A(10);
    }

    B(const B&parm)
    {
        // How to copy the value of parm so this and parm have different A object
        // this.a = parm.a --> both this and parm points to same A object
    }

    B& operator = (const B&parm)
    {
        if (this != &parm)
        {
            this->a = parm.a;
        }
        return *this;
    }

    ~B()
    {
        // Null check 
        delete a;
    }
};

【问题讨论】:

  • a{new A{*parm.a}},使用现代统一初始化语法。
  • "/* Null check */ delete a;"。删除空指针是noop,不需要检查。
  • @Jarod42 当我有两个具有相同 A 实例的 B 对象时,我们不希望那里需要 NULL 检查吗?
  • 我的意思是A* a = nullptr; delete a; 是有效的。

标签: c++ copy-constructor


【解决方案1】:

B 的复制构造函数需要分配一个新的A 对象,该对象从源parm.a 成员中复制data,您可以使用A 的复制构造函数来做到这一点:

B(const B &parm) {
    a = new A(*(parm.a));
}

另外,在B 的赋值运算符中,两个A 对象都已分配,所以只需调用A 的赋值运算符即可:

B& operator=(const B &parm) {
    if (this != &parm) {
        *a = *(parm.a);
    }
    return *this;
}

话虽如此,如果您摆脱指针并让编译器为您处理内存分配和副本,您可以大大简化代码:

class A {
public:
    int data;
    A(int parm = 0) : data(parm) { }
    ~A() { cout << "A is destroyed"; }
};

class B {
public:
    A a;
    B() : a(10) { }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多