Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструктор копирования, не получается 
:(
    Опции темы
NULL
  Дата 12.11.2003, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 22.8.2003

Репутация: нет
Всего: нет



Имеется класс, типа такого
Код

#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, что я не так сделал?
PM MAIL ICQ   Вверх
Vyacheslav
Дата 12.11.2003, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Ошибки

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;
}

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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
NULL
Дата 12.11.2003, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 22.8.2003

Репутация: нет
Всего: нет



спасибо, все работает, надо было просто перегрузить = smile.gif
PM MAIL ICQ   Вверх
Vyacheslav
Дата 12.11.2003, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Если остальное не исправишь, то тоже нарвешься либо на утечки памяти, либо на исключение


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1029 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.