Копирование и переуступка: как сделать глубокую копию? C ++ - PullRequest
0 голосов
/ 10 июля 2020

У меня есть два класса, которые по сути представляют собой строковые классы, которые выглядят следующим образом. Первый класс содержит строку как член, а второй класс также содержит строку плюс массив указателей для класса MenuItem, а также трекер.

const int MAX_NO_OF_ITEMS = 10;

    class Menu; // forward declaration

    class MenuItem {
        char* Menuitem;
        //member functions
        MenuItem(); 
        ...
        ~MenuItem();
        friend Menu; 
    };

    class Menu {
    private:
        char* m_Title;
        MenuItem* m_MenuItems[MAX_NO_OF_ITEMS];
        int m_menuTracker;
     ... //other functions not shown
    }

Я хочу иметь возможность глубокого копирования один объект Menu на другой объект Menu, но то, как я это делаю, выглядит так, как если бы это была неглубокая копия, когда дело доходит до копирования «m_MenuItems». Я точно знаю, что член m_Title глубоко копируется, поскольку я создаю для него «новый» char *, но проблема возникает, когда я пытаюсь скопировать исходный m_MenuItems в место назначения, поскольку они в конечном итоге разделяют та же память. Это вызывает проблемы, потому что, когда вызывается деконструктор, он вызывается дважды для одного и того же объекта, в результате чего моя программа крадет sh.

Вот мой код копии и присваивания:

    Menu& Menu::operator=(const Menu& src) {

        if (this != &src && src.m_Title != nullptr) {
            delete[] m_Title;
            m_Title = nullptr;
           
            m_Title = new char[strlen(src.m_Title) + 1];
            strcpy(m_Title, src.m_Title);
            
            //if current object has menuItems, then delete to make room for src. 
            for (int i = 0; i < m_menuTracker; i++) {
                delete m_MenuItems[i];
                this->m_MenuItems[i] = nullptr;
            }

В следующем for-l oop возникает моя проблема ...

            if (src.m_MenuItems[0] != nullptr) {
                for (int i = 0; i < src.m_menuTracker; i++) {
                    m_MenuItems[i] = src.m_MenuItems[i];
                }
        
                this->m_menuTracker = src.m_menuTracker;
            }
            else
                this->m_menuTracker = 0;
        }
        else {
            this->setEmpty();
        }
        
        return *this;
    }

Как мне выделить новый блок памяти для пункта назначения m_MenuItems?

...