Как написать конструктор копирования для класса с объектом другого класса - PullRequest
0 голосов
/ 23 мая 2018

У меня проблемы с написанием этой довольно простой программы.У меня есть два класса A и B. У объекта B есть объект A. Мне нужно написать конструктор Copy объекта B, чтобы два экземпляра 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;
    }
};

1 Ответ

0 голосов
/ 23 мая 2018
Конструктор копирования

B должен выделить новый объект A, который копирует data из исходного parm.a члена, что можно сделать с помощью конструктора копирования 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) { }
};
...