Форум программистов, компьютерный форум CyberForum.ru

Ошибка в конструкторе копирования класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разработка классов, создание конструкторов и деструкторов http://www.cyberforum.ru/cpp-beginners/thread843107.html
*Постpоить класс для pаботы с рациональными дробями. Класс должен включать следующие поля: числитель, знаменатель, комментарий. *Класс должен обеспечивать пpостейшие методы для pаботы с полями класса: сложение, сокра-щение, вывод дроби в удобной форме. *Реализовать класс. Класс должен обеспечивать набор методов для работы с данными. *Создать констpуктоpы: констpуктоp по умолчанию,...
C++ не могу скомпилировать программу( не могу никак додуматься как скомпилировать, ругается что init() не определен... #include <iostream.h> #include <stdlib.h> struct Node { int inf; Node *next; }; http://www.cyberforum.ru/cpp-beginners/thread843098.html
C++ Не могу разобраться с NetBeans C++
Ребят не подскажите в чём дело. Сначала эту "прогу" на C написал было всё нормально. А вот на C++ не хочет с этими библиотеками. NetBeans не так настроен или что? ( http://s019.***********/i613/1304/74/074c9090b730t.jpg
C++ Общий корень узлов
Имеется странноватая коряга, в которой не предки содержат указатели на потомки, а наоборот. Метод вызван для некоторого узла дерева и принял в параметр Right ссылку на другой узел. Требуется найти максимально далёкий от корня всего дерева корень того поддерева, которое содержит узлы *this и Right.
C++ Выделение памяти http://www.cyberforum.ru/cpp-beginners/thread843073.html
Всем доброго времени суток! Пытаюсь сделать связанный список на 100кк элементов, но не выделив памяти и под половину, программа жрёт 4 гига оперативы, и как вы поняли намерена сожрать больше. Компилятор настроен на платформу х64 и по моим подсчётам это всё дело должно занять в памяти 1.6 гига, подскажите пожалуйста что я делаю не так? // ConsoleApplication62.cpp : Defines the entry point...
C++ закрытое наследование Объясните, плиз. Заранее спасибо В классе Base поле X находится в части private, производный класс объявлен так: class Derived: private Base{…}. Какие из следующих функций могут обращаться к полю X через объект класса Derived, а какие – нет: 1) функция main(), 2) метод класса Base, 3) метод класса Derived? подробнее

Показать сообщение отдельно
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428

Ошибка в конструкторе копирования класса - C++

20.04.2013, 07:25. Просмотров 379. Ответов 8
Метки (Все метки)

Хотя и делал по образцу, но почему то лезет ошибка записи за пределы динамического массива, хотя и переменные копируются верно (отладчик вижлы подтвердил). конструктор наследованного класса даже не ковырял, т.к. ошибка таже
мэин
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include "cd.h"
void Bravo (const Cd & disk);
int main () {
    Cd c1 ("Beatles", "Capitol", 14, 35.5);
    Classic c2 = Classic ("Piano sonata in B flat, Fantasia in C", "Alfred Brendel", "Phillips", 2, 57.17);
    Cd *pcd = &c1;
    using std::cout;
    Cd ad;
    ad = c1;
    cout << "Using object directly:\n";
    c1.Report ();
    cout << '\n';
    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 ();
    std::cin.get ();
    return 0;
};
void Bravo (const Cd & disk) {
    disk.Report ();
};

хэдэр
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 class Cd {
 private:
     char * performers;
     char * label;
     int length;
     int selections;
     double playtime;
 public:
     Cd (char * s1, char * s2, int n, double x);
     Cd (const Cd & d);
     Cd ();
     virtual ~Cd ();
     virtual void Report () const;
     Cd & operator = (const Cd  & d);
 };
 class Classic : public Cd {
 private:
     char * important;
 public:
     Classic ();
     Classic (char * im, char * s1, char * s2, int n, double x);
     Classic (char * im, Cd & temp);
     Classic (const Classic & temp);
     virtual void Report () const;
     Classic & operator = (const Classic & temp);
     virtual ~Classic ();
 };

методы
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "cd.h"
#include <iostream>
#include <cstring>
Cd::Cd () {
    performers = new char [8];
    strcpy (performers, "perfomer");
    label = new char [4];
    strcpy (label, "song");
    selections = 0;
    playtime = 0;
};
Cd::Cd (char  * s1, char * s2, int n, double x) {
    performers = new char [strlen (s1) + 1];
    strcpy (performers, s1);
    label = new char [strlen (s2) + 1];
    strcpy (label, s2);
    selections = n;
    playtime = x;
};
Cd::Cd (const Cd & d) {
    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 {
    using std::cout;
    cout << *performers << ", " << *label << ", " << selections << ", " << playtime;
};
Cd::~Cd () {
    delete [] performers;
    delete [] label;
};
Cd & Cd::operator= (const Cd & d) {
    if (this == &d) return *this;
    delete [] performers;
    delete [] label;
    length = strlen (d.performers);
    performers = new char [length + 1];
    strcpy (performers, d.performers);
    length = strlen (d.label);
    label = new char [length + 1];
    strcpy (label, d.label);
    selections = d.selections;
    playtime = d.playtime;
    return *this;
};
Classic::Classic () : Cd () {
    important = new char [14];
    strcpy (important, "Important song");
};
Classic::Classic (char * im, char * s1, char * s2, int n, double x) : Cd (s1, s2, n, x) {
    important = new char [strlen (im) + 1];
    strcpy (important, im);
};
Classic::Classic (char * im, Cd & temp) : Cd (temp) {
    important = new char [strlen (im) + 1];
    strcpy (important, im);
};
Classic::Classic (const Classic & temp) : Cd (temp) {
    important = new char [strlen (temp.important) + 1];
    strcpy (important, temp.important);
};
Classic & Classic::operator = (const Classic & temp) {
    if (this == &temp) return *this;
    delete [] important;
    Cd::operator= (temp);
    important = new char [strlen (temp.important) + 1];
    strcpy (important, temp.important);
    return *this;
};
Classic::~Classic () {
    delete [] important;
};
void Classic::Report () const {
    Cd::Report ();
    std::cout << ", " << important;
};

другая версия с той же ошибкой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cd & Cd::operator= (const Cd & d) {
    if (this == &d) return *this;
    delete [] performers;
    delete [] label;
    length = strlen (d.performers);
    performers = new char [length];
    strncpy (performers, d.performers,length);
    performers [length] = '\0';
    length = strlen (d.label);
    label = new char [length];
    strncpy (label, d.label, length);
    label [length] = '\0';
    selections = d.selections;
    playtime = d.playtime;
    return *this;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru