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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ТОрчОК
Заблокирован
#1

криво работает коеструктор копии производного класса - C++

29.03.2013, 13:34. Просмотров 268. Ответов 4
Метки нет (Все метки)

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
using namespace std;
#include <conio.h>
class building
{
protected:
    int **A, level, flat;
public:
    building(){};
    building(int l, int f);
    building(const building &ob);
    ~building();
    void show();
    void function(int m,int n);
    int get(int &i,int &j);
};
class B:public building
{
    int *p;
    int a,b,c;
public:
    B(){};
    B(int a1,int b1,int c1);
    ~B();
    B(const B &ob);
    void show1(building ob);
    int get1(int i);
};
building::building(int l, int f)
{
function(l,f);
}
building::building(const building &ob)
{
    function(ob.level,ob.flat);
    for(int i=0;i<ob.level;i++)
    {
        for(int j=0;j<ob.flat;j++)
        {
            A[i][j]=ob.A[i][j];
        }
    }
}
building::~building()
{
    for(int i=0;i<level;i++)
    {
        delete []A[i];
    }
    delete []A;
}
void building::show()
{
    int k=0;
    for(int i=0;i<level;i++)
    {
        cout<<"этаж №"<<i+1<<" ";
        cout<<endl;
        for(int j=0;j<flat;j++)
        {
            k++;
            A[i][j]=rand()%36+64;
            cout<<"квартира №"<<k<<": ";
            cout<<"площадь"<<"-";
            cout<<A[i][j]<<" кв.м";
            cout<<endl;
        }
        cout<<endl;
    }
}
void building::function(int m,int n)
{
    A=new int*[m];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
        A[i]=new int[n];
        }
    }
    level=m;
    flat=n;
}
int building::get(int &i,int &j)
{
    return A[i][j];
}
B::B(int a1,int b1,int c1):building(a1,b1)
{
    a=a1;
    b=b1;
    p=new int [c1];
    c=c1;
}
B::B(const B &ob)
{
    c=ob.c;
    p=new int [ob.c];
    for(int i=0;i<ob.c;i++)
    {
        p[i]=ob.p[i];
    }
}
B::~B()
{
    delete []p;
}
void B::show1(building ob)
{
    int k=0;
        for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
                p[k]=ob.get(i,j);
                cout<<"число комнат на "<<i+1<<" этаже "<<"в "<<k+1<<" квартире - ";
                cout<<p[k]/15<<" ";
                cout<<endl;
                k++;
            }
            
        }
}
    int B::get1(int i)
    {
        return p[i];
    }
int main()
{
    setlocale(LC_ALL,"rus");
    int x,y;
    cout<<"Введите число этажей=";
    cin>>x;
    cout<<"Введите число квартир на этаж=";
    cin>>y;
    building b(x,y);
    building d=b; //подобная инструкция для B e=a работает криво.
    B a(x,y,x*y);
    b.show();
    a.show1(b);
    d.show();
    a.show1(d);
    getch();
}
когда пытаюсь присвоить объект произ. класса др. объекту создается копия (по крайней мере вызывается конструктор копий), но вместо вывода того что нужно вылетает с вот этим вот _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
что не так?

Добавлено через 40 минут
может и не конструктор, но память все равно где-то крошится. в чем может быть причина.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 13:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос криво работает коеструктор копии производного класса (C++):

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Вызов объектом базового класса функцию из производного класса! - C++
Как можно осуществить вызов или передачу значения в базовый класс для дальнейшего вычисления этого значения в производном классе. Вот...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.03.2013, 15:05 #2
Копирующий конструктор дочернего класса надо объявить так:
C++
1
B::B(const B &ob) : building(ob)
ТОрчОК
Заблокирован
30.03.2013, 14:37  [ТС] #3
объявил правильно констр. копий, теперь память не крошится. теперь при
присваивании и вызове соответствующей функции
C++
1
2
B e=a;
e.show1(d);
необходимая инфа не выводится. только вот не понятно почему.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.03.2013, 14:53 #4
ТОрчОК, так нужно ещё оператор= реализовать. Вот, почитайте.
ТОрчОК
Заблокирован
30.03.2013, 15:06  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
ТОрчОК, так нужно ещё оператор= реализовать. Вот, почитайте.
зачем? почему же присваивание building d=b нормально работает?

Добавлено через 2 минуты
все вроде бы догнал. спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 15:06
Привет! Вот еще темы с ответами:

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...

Предобъявление производного класса - C++
Привет всем. Такой вопрос:как предобъявить производный класс? Просто нужно сделать функцию друга как для производного, так и для базового...

Конструктор производного класса - C++
Доброго времени суток!! Значит так, есть у меня две строки большая и маленькая и два класс String и bString, где bString производный от...

Тип производного класса - C++
Как можно узнать тип производного класса на этапе компиляции?#include &lt;iostream&gt; #include &lt;type_traits&gt; struct A {}; struct B : A...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.03.2013, 15:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru