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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не понятно шо за ошибка? http://www.cyberforum.ru/cpp-beginners/thread854680.html
Здорова! Пытаюсь создать список вот код: #include <iostream> using std::cout; using std::endl; using std::cin; template<class T> class List//optimal6nui {
C++ Вычислить среднее геометрическое. ФУНКЦИИ Вычислить среднее геометрическое для каждого элемента одномерного массива по следующему правилу : (см. картинку) Использовать функцию вычисления среднего геометрического одномерного массива. http://www.cyberforum.ru/cpp-beginners/thread854670.html
Предел макисально целого числа C++
Подскажите пожалуйста, В СРР есть предел макисально целого числа он записан в long long int, есть ли какая-то возможность обойти этот предел. P.S. Если не понятно вышенаписанное, я имел ввиду, что для вычисления факториала больше 20 потребуется реализовать длинную арифметику, но может есть способо вычислить факториал без этого, просто сняв ограничение по long long int? Компьютеру все равно что...
Поиск остовного леса методом Соллина C++
Доброго времени суток. Передо мной встала задача найти остовной лес минимальной стоимости методом Соллина. Интернет предложил единственный вариант реализации данного алгоритма (приведён ниже). Сразу скажу, ошибка в том, что он не делает разницы было ли рассмотрено ребро или нет (т.е. 2 раза рассмотреть одно и то же ребро, от начальной вершины к конечной и наоборот). Соответственно, к...
C++ Итерационные и рекурсивные алгоритмы http://www.cyberforum.ru/cpp-beginners/thread854644.html
Вычислить на ЭВМ значение суммы членов бесконечного ряда с заданной точностью и значение суммы, определяемое пределом суммы ряда ( по формуле). Напечатать значения сумм и число циклов ряда, вошедших в сумму. На с++. Sin(x)=∑(-1)n-1*x^(2n-1)/(2n-1)!=x - x^3/3! + x^5/5!-x^7/7! +x^9/9! - x^11/11!
C++ Чистая виртуальная функция Скажите, может ли чистая виртуальная функция иметь тело? В книге написано что может, но не написано как. Пытался сам определить по-разному - не получилось. В интернете нашел пару примеров с телами, но они тоже не работают. подробнее

Показать сообщение отдельно
vruleb
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 17

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

03.05.2013, 09:57. Просмотров 303. Ответов 3
Метки (Все метки)

Здравствуйте. Есть один класс для работы с многочленами, который хранит элементы многочлена в списке. Так вот, в конструкторе копирования (строка 30) происходит непонятная ошибка. Что самое странное, метод для добавления новых элементов многочлена работает нормально, так как сам по себе спокойно выполняет свои действия.
В какую сторону копать?
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <iostream>
 
using namespace std;
 
class Pol{
public:
   class Element{                     
   private: 
      int *data; // элемент многочлена
   public: 
      Element *next; // следующий элемент
      Element *prev; // предыдущий
      Element():next(NULL),prev(NULL){data=new int(0);}; // конструктор по-умолчанию
      Element(int val):next(NULL),prev(NULL){data=new int(val);}; // перегруженный конструктор
      Element (Element &e)      // конструктор копирования
      {
         data=new int(e.getData());
         next=e.next;
         prev=e.prev;
      }
      ~Element(){if (data) delete data;next=prev=NULL;}  // деструктор
 
      int getData(){return *data;}  // метод для получения
      void setData(int val){*data=val;} // и установки данных
   };
   public: 
   Element *first; // первый элемент
   Element *last; // последний
   Pol(Pol &e)  // конструктор копирования
   {
       Pol *z=new Pol();
       Element *i=e.first;  // указатель на первый элемент входного многочлена
       while(i)
       {
           cout << i->getData();
           Add(i->getData());  // добавить все элементы в многочлен
           i=i->next;
       }
   }
   Pol():first(NULL),last(NULL){} 
   Pol operator *()
   {
       return *this;
   }
   virtual ~Pol() // деструктор списка
   {
      Element *p=last;
      while(p)
      {
         Element *pt=p;
         p=p->prev;  
         delete pt; // удаление элементов с конца
      }
      first=last=NULL; // и указателей
   } 
protected:
   void coreAdd(int val)
   {
      Element *t=new Element(val); // создать новый элемент с содержимым val
      if(first==NULL)   // если элементов нет
      {
         first=last=t; // то он первый и последний
         first->next=last->next=NULL; 
         first->prev=last->prev=NULL;
         return; 
      }
      // если есть элементы
      last->next=t; // добавляем после последнего
      t->prev=last; // бывший последний теперь предпоследний
      last=t; // последний - новый элемент
      last->next=NULL;
      return;
   }
   void coreDelete(int n)  
   {
      // поиск выбранного элемента
      if (n<=0)
          cout << "Элемент не найден\n";
      n--; 
      Element *i = first;
      int k=0;
      while (i && k<n)
      {
         i = i->next;
         k++;
      }
 
      if (i)
      {
          i->setData(0); // занулить коэффициент
          if (i==last)  // если занулённый коэффициент - последний коэффициент при многочлене
              while(i->prev!=NULL && i->getData()==0)            // то удалить все нулевые элементы позади
              {
                  Element *t = new Element(*last);
                  last=last->prev;
                  last->next=NULL;
                  delete t;
                  i=i->prev;
              }
      }
   }
public:
   // добавление в конец списка
   virtual void Add(int val) 
   {
      coreAdd(val);
   }
   // удаление элемента
   virtual void Delete(int n)  
   {
      coreDelete(n);
   }
   // вывод многочлена
   friend ostream &operator<<( ostream &output, const Pol &elem)
   {
      int g, h=0;
      Element *i=elem.first;
      cout << endl;
      while (i) // пока есть элементы
      {
        g=i->getData();
        if (g < 0)    // Если коэффициент - отрицательное число
        {                    
        if (h==0)
         cout << g;
        else
            cout << g << "x^" << h; 
        h++;
        }
        if (g==0)
        {
            h++; cout << "+0";
        }
        if (g > 0)
        {
         if (h==0)
             cout << "+" << g;
         else 
             cout << "+" << g << "x^" << h;
         h++;
        }
            i=i->next; // в направлении --->>> 
      }
      return output;
   }
   };
 
void test(Pol a)
{
    Pol c=a;
}
 
int main()
{
    int h=2, l=67;
    Pol b, k; // создать два объекта класса Pol
    b.Add(566); b.Add(453); // заполнить их
    cout << b;
    test(b);
    getchar();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru