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

Не работает конструктор копирования почему-то... - C++

Восстановить пароль Регистрация
 
vladislava131
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 4
19.04.2012, 20:20     Не работает конструктор копирования почему-то... #1
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
#include "stdlib.h"
#include "stdio.h"
#include <iostream>
#include <cstddef> 
using namespace std;
 
class Top
{
public:
    Top (){};
    Top (int v, Top *n){d = v, next = n;};
int d;
Top* next;
};
 
class Stack
{
Top* p;
public:
    Stack (){Top *p = NULL; }// {p = first(1);};
    Stack (int d);
    bool IsEmpty() {if (p != NULL) return false; else true; };
    Stack ( Stack& mp)  
    {
        Stack B; Top *p = mp.p; while(p != NULL)
        { mp.push(p -> d); p = p -> next;} 
        while (!mp.IsEmpty()) {push(mp.pop());} 
    };
void push2(int d){p = new Top (d, p);};
int pop ();
void push (int d);
int top ();
Top *first(int d)
{
    Top *s = new Top;
    s -> d = d;
    s -> next = NULL;
    return s;
}
Top *find( int d)
{
    Top *s = p;
    while ( s != 0)
    {
        if ( s -> d == d) break;
        s = s -> next;
    }
    return s;
};
void ra (int key, int d);
void ra2 (int key1, int d);
void pechat();
};
 
Stack :: Stack (int d)
{
  push(d);
}
 
int Stack :: pop ()
{
    int value = 0;
    value = p -> d; 
    Top *s = p;
    p = p -> next;
    delete (s);
    return value;
}
 
void Stack :: push (int d)
{
    Top *s=  new Top;
    s -> d = d;
    s -> next = p;
    p = s;
}
 
int Stack :: top ()
{
    return p -> d;
}
 
void Stack :: ra (int key, int d)
{
    Top *stack1 = find(key);
    Top *ptr = p;
    Top *ptr1 = p;
    for ( int i = 0; i < d -1; i ++) ptr = ptr -> next;
    while ( ptr1 -> next != stack1) 
    {
        ptr1 = ptr1 -> next;
    }
    ptr1 -> next = ptr1 -> next -> next;
    stack1 -> next = ptr -> next;
    ptr -> next = stack1;
}
 
void Stack :: ra2 (int key1, int d)
{
    Top * stack1 = find (key1);
    Top *ptr = p;
    Top *ptr1 = p;
    for (int i = 0; i < d - 1; i ++)
    {
        ptr = ptr -> next;
    }
    while(ptr1 -> next != stack1){ptr1 = ptr1 -> next;}
    ptr1 ->next = ptr1 -> next -> next;
}
 
void Stack :: pechat ()
{
    while (p != NULL)
    {
        printf ("%d", pop());
    }
}
 
int main ()
{
    int n, i;
    Stack m;
    Stack();
    for ( i = 2; i < 6; i ++)
    {
        m.push(i);
    }
    n = m.top();
    Stack d (m);
    printf("%d\n", n);
    m.pechat();
    d.pechat();
    //m.ra(2,1);
    //m.pechat();
    //m.ra2(2,4);
    //m.pechat();
    printf("\n");
    return 0;
}
Не работает конструктор копирования почему-то...Всё остальное хорошо)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2012, 20:20     Не работает конструктор копирования почему-то...
Посмотрите здесь:

Почему встроенная функция вызывает конструктор копирования? C++
C++ ПОчему не вызывается конструктор копирования? Должен вызываться!
C++ Конструктор копирования не работает
C++ Не работает конструктор копирования
C++ неправильно работает конструктор копирования list, кто-нибудь может объяснить почему?
Как работает конструктор копирования C++
C++ не работает конструктор копирования
Как работает конструктор копирования? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Heretiqu3
10 / 10 / 2
Регистрация: 19.04.2012
Сообщений: 20
19.04.2012, 21:26     Не работает конструктор копирования почему-то... #2
Цитата Сообщение от vladislava131 Посмотреть сообщение
Всё остальное хорошо)
Я бы поспорил
; нужна только в объявлении(прототипе) функции(метода), в определении - нет.
Конструктор по умолчанию класса Top пустой, поэтому там будет содержаться указатель указывающий неизвестно куда.
Так же данные, по правилам ООП, должны быть защищены, в том же классе Top. Подружите классы или сделайте Top вложенным
так как пишите в строку методы, не суждено, что будут такие ошибки:
C++
1
2
3
4
5
6
7
8
9
bool IsEmpty()
{
   if (p != NULL)
   { 
      return false; 
   }
   else
     [B] true;[/B]
   };
конструктор копирования должен принимать константный объект (а зачем там создаете обьект B? )
Так же вы принимаете объект, С КОТОРОГО копировать данные, а не которому.
нет оператора присваивания



ну и по мелочи Top *p = NULL; лучше nullptr
данным класса присваивайте имена начинающиеся с префикса, например m_, чтобы не запутаться

C++
1
2
3
4
5
6
7
8
9
10
11
Stack(const Stack & mp) //const
{
   p = new Top;
   Top * pr = mp.p;
   while(pr != NULL)
   {
      push(pr->d);
      pr = pr->next;
   } 
   //while (!mp.IsEmpty()) {push(mp.pop());}  зачем разрушать копируемый стэк?
}
конструктор Top
C++
1
Top() { d = 0; next = nullptr; }
Успехов!
Yandex
Объявления
19.04.2012, 21:26     Не работает конструктор копирования почему-то...
Ответ Создать тему
Опции темы

Текущее время: 08:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru