Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в конструкторе копирования. Ошибка памяти, помогите исправить. 
:(
    Опции темы
Killer_13
Дата 6.11.2010, 16:12 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Программа, "+" "-" полиномы.
Вот, исходник, все работает, но!

Когда со строчки 50 залетает а строчку 8 *cpp тогда пишет, что не может выделить память. Что может это быть?
main
Код

using namespace std;
#include "Polynom.h"
#include "Image.h"
#include "BmpWrite.h"
#include "hline.h"
#include "vline.h"
#include <fstream>

#if OPTIONAL
void optinal(void);
#endif


int main() {
  cout << "OOP-Praktikum, Versuch 4" << endl;
  //
  // Polynome spezifizieren, verknuepfen und ausgeben
  //
  Polynom P(X(4) - 3.0*X(3) + 2.0*X(5) + 1.0);
  cout << "P:   " << P << endl;
  Polynom Q;
  Q = 2.0*X(2) - 3.0*X(1) + 7.0;
  cout << "Q:   " << Q << endl;
  cout << "P+Q: " << P+Q << endl;
  Polynom PmQ(P-Q);
  cout << "P-Q: " << PmQ << endl;
  Polynom A(2.0*X(2)+3.0*X(1) + 4.0);
  cout << "A:   " << A << endl;
  //Polynom B = X(1)+1.0;
  //cout << "B:   " << B << endl;
  cout << "P-P: " << P-P << endl;
  cout << "P(0,75)=" << P(0.75) << endl;

  //
  // Koeffizienten eines Polynoms ermitteln
  //
  Polynom C = P+A;
  cout << "Koeffizienten von C=P+A:";
  for (int i=C;i>=0;i--) {
    cout << " " << C[i];
  }
  cout << endl;

  //
  // Polynome in ein Image-Objekt einzeichnen
  //
  /*MY COOMENT BEREICH
  Image I(400,300);
  HLine(20, 150, 360, RGB_Pixel(0,0,255)).draw(I);
  VLine(200, 20, 260, RGB_Pixel(0,0,255)).draw(I);
  // Im Intervall von x={-3..3} und y={-20..20} zeichnen und dies im
  // Pixelbereich x_i={20..380} und y_i={20..280} darstellen
  P.draw(I, 20,380,20,280, -3.0,3.0,-20.0,20.0, RGB_Pixel(0,255,255));
  Q.draw(I, 20,380,20,280, -3.0,3.0,-20.0,20.0, RGB_Pixel(255,255,0));

  //
  // Image-Objekt in BMP-Datei ausgeben
  //
  cout << "Datei P4.bmp wird geschrieben" << endl;
  BmpWrite("P4.bmp",I);
   * */

#if OPTIONAL
  optinal();
#endif

  return 0;
}


*.h
Код


#include <iostream>
#include <cmath>
#include "Image.h"
using namespace std;

#ifndef OPTIONAL
#define OPTIONAL 0
#endif


class Polynom {
 private:
  int Grad;
  double *K;
 public:
  Polynom (const Polynom &p);                   // Kopierkonstruktor
  Polynom (const int g=0,const double v=0.0);   // Konstruktor f�r Polynom mit Grad g
  ~Polynom();
  Polynom operator= (const Polynom& r);         // Zuweisungsoperator (tiefe Kopie)
  operator int () const;                        // Konversion: Grad des Polynoms auslesen
  double  operator[] (const int i) const;       // Zugriff auf die Koeffizienten
  double  operator() (const double &x) const;   // Berechnung des Funktionswerts
  // Operatoren und Funktionen
  Polynom operator+ (const Polynom &r) const;   // Polynomaddition
  Polynom operator- (const Polynom &r) const;   // Polynomsubtraktion
#if OPTIONAL
  Polynom operator* (const Polynom &r) const; // Polynommultiplikation (optional)
  Polynom operator/ (const Polynom &r) const; // Polynomdivision (optional)
  Polynom operator% (const Polynom &r) const; // Polynom-Modulo-Operation (optional)
  Polynom Ableitung() const;                  // Ableitung des Polynoms bilden (optional)
#endif
  // Hilfsmethoden zur Polynomeingabe
  Polynom operator+ (const double  &r) const;
  Polynom operator- (const double  &r) const;
  
  // Zeichnen eines Polynoms in ein Image-Objekt // (siehe Aufgabe 4)
  /* MY COMMENT BEREICH
  void draw( Image &I, int i_xs, int i_xe, int i_ys, int i_ye,
             double xs, double xe, double ys, double ye,
             RGB_Pixel color );
   */
};

// Ueberladener Ausgabeoperator
ostream& operator << (ostream& o,const Polynom& P);

// Hilfsklasse zur Polynom-Eingabe
class X {
 private:
  int power;
 public:
  X(const int i):power(i) {}
  int get_power () const { return power; }
  operator Polynom () const { return Polynom(power,1.0);}
  Polynom operator+ (const Polynom &r) const { return Polynom(*this) + r; }
  Polynom operator- (const Polynom &r) const { return Polynom(*this) - r; }
  Polynom operator+ (const double &r)  const { return Polynom(*this) + r; }
  Polynom operator- (const double &r)  const { return Polynom(*this) - r; }
};

// Hilfsfunktion zur Polynomeingabe
inline Polynom operator *(const double l, const X &r) {return Polynom(r.get_power(),l);}



*.cpp
Код

#include "Polynom.h"

using namespace std;

//-----------------------------------------------------------------------------

Polynom::Polynom(const Polynom& p) {
    *this = p;
}

//-----------------------------------------------------------------------------

Polynom Polynom::operator =(const Polynom& r) {

    delete [] K;
    
    (*this).Grad = r.Grad;
    K = new double [(*this).Grad + 1];
    for (int i = 0; i <= Grad; ++i)
        K[i] = r.K[i];

    return *this;
}

//-----------------------------------------------------------------------------

Polynom::Polynom(const int g, const double v){

    Grad=g;
    K=new double [Grad+1];

    for(int i=0;i<Grad;++i)
        K[i]=0.0;

    K[Grad]=v;
}

//-----------------------------------------------------------------------------

Polynom Polynom::operator -(const Polynom& r) const {

    if ((*this).Grad >= r.Grad) {
        Polynom temp(Grad);
        for (int i = r.Grad; i < Grad; ++i)
            temp.K[i] = (*this).K[i];
        for (int i = 0; i <= r.Grad; ++i)
            temp.K[i] = (*this).K[i] - r.K[i];
        //Polynom tt=temp;

        return temp;
    } else {
        Polynom temp(r.Grad);
        for (int i = (*this).Grad; i <= r.Grad; ++i)
            temp.K[i] = r.K[i];
        for (int i = 0; i <= (*this).Grad; ++i)
            temp.K[i] = (*this).K[i] - r.K[i];

        return Polynom(temp);
    }
}

//-----------------------------------------------------------------------------

Polynom Polynom::operator +(const double& r) const {

    Polynom temp(*this);
    temp.K[0] += r;

    return temp;
}

//-----------------------------------------------------------------------------

Polynom Polynom::operator -(const double& r) const {

    Polynom temp(*this);
    temp.K[0] -= r;

    return temp;
}

//-----------------------------------------------------------------------------

Polynom Polynom::operator +(const Polynom& r) const{

        if ((*this).Grad >= r.Grad) {
        Polynom temp(Grad);
        for (int i = r.Grad; i <= Grad; ++i)
            temp.K[i] = (*this).K[i];
        for (int i = 0; i <= r.Grad; ++i)
            temp.K[i] = (*this).K[i] + r.K[i];

        return temp;
    } else {
        Polynom temp(r.Grad);
        for (int i = (*this).Grad; i <= r.Grad; ++i)
            temp.K[i] = r.K[i];
        for (int i = 0; i <= (*this).Grad; ++i)
            temp.K[i] = (*this).K[i] + r.K[i];

        return temp;
    }
}

//-----------------------------------------------------------------------------

double Polynom::operator ()(const double& x) const{

    double result=0.0;

    for(int i=0;i<(*this).Grad;++i)
        result+=(*this).K[i]*pow(x,i);

    result+=(*this).K[0];

    return result;
}

//-----------------------------------------------------------------------------

Polynom::operator  int() const{
    return Grad;
}

//-----------------------------------------------------------------------------

double Polynom::operator [](const int i) const{

    return (*this).K[i];
}

//-----------------------------------------------------------------------------

Polynom::~Polynom(){
    delete [] K;
}

//-----------------------------------------------------------------------------

ostream & operator<<(ostream& o, const Polynom& P) {
    o << '(';
    for (int i = static_cast<int> (P); i>0; --i){
        
    if(i!=static_cast<int>(P) && P[i]>=0)                                                         
         o<<'+';
    o << P[i] << "*X(" << i << ')';
    }

     if(P > 0 && P[0] >=0) o<<'+';
    o << P[0] << ')';

    return o;
}




ПАСИБ!!!

Это сообщение отредактировал(а) Killer_13 - 6.11.2010, 16:21
PM MAIL   Вверх
leniviy
Дата 6.11.2010, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



1) Надо "double *K" проинициализировать
2) сочетание "Polynom (const Polynom &p);" и "Polynom operator= (const Polynom& r);" вызывает бесконечную рекурсию
надо "Polynom& operator=" (с &)

3)В конструкторе копирования не стоит вызывать "*this = p;", потому что код оператора "=" сначала удаляет старые ресурсы: "delete []K", затем копирует новые.
А в конструкторе нам не надо удалять старые ресурсы. Поэтому лучше вынести код копирования в отдельную функцию и вызывать её в конструкторе и в операторе = (после "delete []K").

Это сообщение отредактировал(а) leniviy - 7.11.2010, 11:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.