У меня есть два класса, которые по сути представляют собой строковые классы, которые выглядят следующим образом. Первый класс содержит строку как член, а второй класс также содержит строку плюс массив указателей для класса 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?