Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Конструктор копирования


Автор: NULL 12.11.2003, 10:24
Имеется класс, типа такого
Код

#include <iostream.h>

typedef struct{
int x;
int y;
int h;
}SSTRUC, *PSSTRUC;

class C{
public:
C(){pSt = new SSTRUC;}
C(const C &st){pSt = new SSTRUC; pSt = st.pSt;}
C* SetC(PSSTRUC st){pSt = st; return this;}
int GetCx(){return pSt->x;}
~C(){delete pSt;}
private:
PSSTRUC pSt;
};

void main(){
PSSTRUC st = new SSTRUC;
C* cl1 = new C;
C* cl2 = new C;

st->x = 10;
cl1->SetC(st);
cl2 = cl1;
cout << cl2->GetCx();
st->x = 20;
cl1->SetC(st);
cout << cl2->GetCx();
/*delete cl1;
delete cl2;*/
}

в результате будет 1020, что я не так сделал?

Автор: Vyacheslav 12.11.2003, 11:05
Ошибки

1) возможны утечки памяти из-за неправильно реализованного SetC
Лучше так
C* С::SetC(PSSTRUC st)
{
if (pSt)
delete pSt;
pSt = st;
return this;
}
или так, если нужна копия структуры
C* С::SetC(PSSTRUC st)
{
*pSt = *st;
return this;
}


2) возможна утечка паямяти и попытка двойного освобождения pSt, если использован конструктор копирования.
из-за неправильно реализованного конструктора копирования
Надо
C(const C &st){ pSt = new SSTRUC; *pSt = *st.pSt;}

3) Конструктор копирования у тебя не используется, даже не задействован. Они бы работал, если ты бы написал что-то вроде этого
C cl3 =*cl1;
А при cl2 = cl1; копируются указатель. В этом случае в cl2 храниться указатель на объект, на который также указывает сд1 и кодом
delete cl1;
delete cl2;
ты пытаешь удалить дважды один и тот же объект. Второй объект у тебя просто теряется
Если ты хотел выполнить копирования
тебе надо было выполнить
*cl2 = *cl1;
Но при этом надо определить оператор копирования


const C& C::operator=( const C& other)
{
if ( this != &other )
{
*pSt = *other.pSt;
}
return *this;
}

Вроде все. Кажется больше ничего не забыл.

Автор: NULL 12.11.2003, 12:22
спасибо, все работает, надо было просто перегрузить = smile.gif

Автор: Vyacheslav 12.11.2003, 13:07
Если остальное не исправишь, то тоже нарвешься либо на утечки памяти, либо на исключение

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)