Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2011, 14:17   #1
kenzoxai
Новичок
Джуниор
 
Регистрация: 21.05.2011
Сообщений: 1
По умолчанию Проблема перегрузки операции присваивания с производным классом

Привет Всем сочувствующим! Неделю назад загорелся изучить С++ и теперь не могу остановиться В качестве учебного материала был выбран Стивен Прата "С++ Лекции и Упражнения" и иногда без посторонней помощи не обойтись.

В общем код программы такой:

ЗАГОЛОВОЧНЫЙ ФАЙЛ.

PHP код:
#ifndef _CLASSIC_H_
#define _CLASSIC_H_

class Cd 
{
private:
    
char *performers;
    
char *label;
    
int selections;
    
double playtime;
public:

    
Cd(char s1char s2int ndouble x);
    
Cd(const Cd d);
    
Cd();
    
virtual ~Cd();
    
virtual void Report() const;
    
Cd operator=(const Cd d);
};
class 
Classic : public Cd
{
private:
    
char *arr;
public:
    
Classic(char s1 "noname"char s2 "nolabel"char *s3 "nonono"int n double x 0.0);
    
Classic(const Classic &d); //конструктор копирования
    
Classic operator=(const Classic d);
    
virtual void Report() const;
    ~
Classic() {delete [] arr;}

};
#endif 
ОПРЕДЕЛЕНИЕ МЕТОДОВ КЛАССОВ

PHP код:
#include <iostream>
#include <cstring>
#include "classic.h"
using namespace std;

Cd::Cd(char *s1char *s2int ndouble x)
{
    
int len strlen(s1);
    
performers = new char [len+1];
    
strcpy(performers,s1);
    
performers[len+1]='\0';
    
    
int len1 =strlen(s2);
    
label = new char[len1+1];
    
strcpy(labels2);
    
    
label[len1+1]='\0';
    
selections n;
    
playtime x;
}
Cd::Cd()
{
    
    
performers = new char [1];
    
performers[0]='\0';
    
    
    
label = new char[1];
        
    
label[0]='\0';
    
selections 0;
    
playtime 0;
}
Cd::Cd(const Cd &d//оператор копирования Cd
{
    
performers = new char[strlen(d.performers)+1];
    
strcpy(performers,d.performers);
    
label = new char[strlen(d.label)+1];
    
strcpy(label,d.label);
    
selections=d.selections;
    
playtime=d.playtime;
}

void Cd::Report() const
{
    
cout << "\nperformers :" << performers;
    
cout << "\nlabel :" << label;
    
cout << "\nselections :" << selections;
    
cout << "\nplayrime :" << playtime;
}
Cd::~Cd()
{
    
delete [] performers;
    
delete [] label;
}

Cd Cd::operator =(const Cd &d)
{
    if (&
d==this) return *this;
    
delete [] performers;
    
performers = new char[strlen(d.performers)+1];
    
strcpy(performers,d.performers);
    
delete [] label;
    
label = new char[strlen(d.label)+1];
    
strcpy(label,d.label);
    
selections=d.selections;
    
playtime=d.playtime;
    return *
this;
}
//методы Classic

Classic::Classic(char s1char s2char *s3int ndouble x) : Cd(s1s2n,x)
{
    
arr = new char [strlen(s3)+1];
    
strcpy(arr,s3);
    
arr[strlen(s3)]='\0';
}
void Classic::Report() const
{
    
Cd::Report();
    
cout << "\nzadacha :" << arr;
}
Classic Classic::operator =(const Classic &k// операция присваивания
{
    if (&
k==this)
        return *
this;
    
Cd::operator =(k);
    
delete [] arr;
    
arr = new char[strlen(k.arr)+1];
    
strcpy(arrk.arr);
    return *
this;
}
Classic::Classic(const Classic &d//оператор копирования Classic
:Cd(d)
{
    
arr = new char[strlen(d.arr)+1];
    
strcpy(arr,d.arr);

ИСХОДНИК

PHP код:
#include <iostream>
#include <cstring>
#include "classic.h"
using namespace std;
void Bravo(const Cd disk);
int main()
{
    
Cd c1("Beatles""Capitol"1435.5);
    
Classic c2 Classic("Piano Sonata in B flat, Fantasia in C""Alfred Brendel""Philips"257.17);
    
Cd *pcd = & c1;
    
cout << "Using object directly:\n";
    
c1.Report();
    
c2.Report();
    
cout << "\nUsing type cd * pointer to objects:\n";
    
pcd->Report();
    
pcd = &c2;
    
pcd->Report();
    
cout << "\nCalling a function with a Cd reference argument:\n";
    
Bravo(c1);
    
Bravo(c2);
    
cout << "\nTesting assignment: ";
    
Classic copy;
    
copy c2;
    
copy.Report();
    
cin.get();
    return 
0;
    
}
void Bravo(const Cd disk)
{
    
disk.Report();

программа собирается без проблем. запускается и при выполнении следующей строки зависает:

PHP код:
copy c2
при отладке было обнаружено что программа запинается в следующем месте:

PHP код:
Cd Cd::operator =(const Cd &d)
{
    if (&
d==this) return *this;
    
delete [] performers;   // !!!ВОТ ЗДЕСЬ ОНА ЗАПИНАЕТСЯ!!!
    
performers = new char[strlen(d.performers)+1];
    
strcpy(performers,d.performers);
    
delete [] label;
    
label = new char[strlen(d.label)+1];
    
strcpy(label,d.label);
    
selections=d.selections;
    
playtime=d.playtime;
    return *
this;

Объясните пожалуйста, что тут не так?
Спасибо всем кто откликнется.

P.S. Вообще моя специальность АСУ. Программирование контроллеров и т.д. для этого и нужен С++. В базовый курс университета входили только лабораторные по Ассемблеру. Может кто подскажет литературу по С++ для моей специализации?
kenzoxai вне форума Ответить с цитированием
Старый 24.05.2011, 15:43   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Си больше подойдет для вашей специальности, там и книга есть именно по программированию микроконтроллеров, но за качество ее не ручаюсь, т.к. сам не интересовался
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с классом cyber_NINJA Общие вопросы Delphi 4 27.12.2010 20:41
Проблема с классом Celestia Общие вопросы Delphi 3 03.12.2010 15:40
Проблема с классом _-Re@l-_ Общие вопросы C/C++ 3 23.09.2010 19:15
Проблема с классом list Homer_J_Simpson Общие вопросы C/C++ 4 28.11.2009 22:03
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15