2015-09-04 3 views
-1

У меня есть этот классКак глубокая копия неподписанных долгое

typedef unsigned long Item; 
class Stack 
{ 
private: 
    enum { MAX = 10} ; 
    Item * pitems;  
    int size;   
    int top;   
public: 
    Stack(int n = 10); 
    Stack(const Stack & st); 
}; 

Как я сделать глубокую копию Item? Правильно ли это?

pitems = st.pitems; 

Stack::Stack(const Stack & st){ 
size = st.size; 
pitems = new Item[size + 1]; 
pitems = st.pitems; 
top = st.top;} 
+0

Вы хотите скопировать пункты или указатель? В настоящее время кажется, что вы просто указали указатель. ИМО у вас будет утечка памяти. – Blacktempel

+0

Я хочу скопировать элементы. – Knot

ответ

3

Петля через них и копировать их, а не указатель другого класса.

Stack::Stack(const Stack &st) 
{ 
    this->size  = st.size; 
    this->top  = st.top; 
    this->pitems = new Item[this->size + 1]; 
    for (auto i = 0; i < this->size; ++i) 
    { 
     pitems[i] = st.pitems[i]; 
    } 
} 

Как уже упоминалось ранее, у вас в настоящее время имеется утечка памяти.

2

Нет, вам нужно пройти через каждый из элементов старого массива и создать новые копии для нового массива.

for(int i = 0; i != size; ++i) 
{ 
    pitems[i] = st.pitems[i]; //Assuming you have an equals operator for Item 
} 

И, безусловно, не делают pitems = st.pitems;, поскольку это просачивается новый массив, который вы сделали с new Item[size + 1]

Смежные вопросы