Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

destruktor usuwa zmienna przed przekazaniem wartosci

Ostatnio zmodyfikowano 2014-03-13 18:31
Autor Wiadomość
arknaw
Temat założony przez niniejszego użytkownika
destruktor usuwa zmienna przed przekazaniem wartosci
» 2014-03-13 18:03:20
Witam, jestem bardzo początkującym programista w C/C++. Mam problem z programem który napisałem:
C/C++
#ifndef _naglowki_h
#define _naglowki_h
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;

class cMatrix
{
    int n, m; //n-liczba wierszy, m-liczba kolumn
    double ** T;
public:
    cMatrix();
    cMatrix( int n, int m );
    cMatrix( const cMatrix & X );
    ~cMatrix();
    void Przydziel( int _n, int _m ); //funkcja wywoływana w konstruktorze
    void Zwolnij();
    friend ostream & operator <<( ostream & str, const cMatrix & X );
    friend istream & operator >>( istream & str, cMatrix & X );
    void ones();
    cMatrix & operator =( const cMatrix & X );
    cMatrix operator *( const cMatrix & X );
   
};

#endif
i main.cpp:
C/C++
#include "naglowki.h"
cMatrix cMatrix::operator *( const cMatrix & X )
{
    cMatrix temp( this->n, this->m ); // macierz tymczasowa o wymiarach zgodnych z macierza mnozona
    if( this->m == X.n )
    {
       
        for( int j = 0; j < this->n; j++ )
        for( int k = 0; k < X.m; k++ )
        {
            float u = 0;
            for( int l = 0; l < this->m; l++ )
                 u += this->T[ j ][ l ] * X.T[ l ][ k ];
           
            temp.T[ j ][ k ] = u;
        }
    }
    return temp;
}
//********************************
cMatrix & cMatrix::operator =( const cMatrix & X )
{
    n = X.n;
    m = X.m;
    T = X.T;
    return * this;
}
//********************************
cMatrix::~cMatrix()
{
    if( T != NULL ) Zwolnij();
   
}
//********************************
void cMatrix::Zwolnij()
{
    for( int i = 0; i < this->n; i++ )
         delete[] T[ i ];
   
    delete T;
    n = 0;
    m = 0;
}
cMatrix::cMatrix( const cMatrix & X )
{
    n = X.n;
    m = X.m;
    T = X.T;
}
//********************************
void cMatrix::Przydziel( int _n, int _m )
{
    if( T != NULL ) Zwolnij();
   
    T = new double *[ _n ];
    for( int i = 0; i < _n; i++ )
         T[ i ] = new double[ _m ];
   
    n = _n;
    m = _m;
   
    /*wypełnia macierz dla której przydzielono pamiec zerami*/
    for( int j = 0; j < _n; j++ )
    for( int k = 0; k < _m; k++ )
         T[ j ][ k ] = 0;
   
}
//********************************
cMatrix::cMatrix( int N, int M )
{
    n = 0;
    m = 0;
    T = NULL;
    Przydziel( N, M );
}
//********************************
cMatrix::cMatrix()
{
    n = 0;
    m = 0;
    T = NULL;
}
//********************************
int main()
{
    cMatrix A, B( 3, 3 ), C;
   
    cin >> A;
    cout << "macierz A:" << endl << A;
    B.ones();
    cout << "macierz B:" << endl << B;
    C = A * B;
    cout << "C=A*B:" << endl << C;
   
    system( "pause" );
    return 0;
}
i pojawia się problem: "Access violation reading location". po przejrzeniu programu widze że wywala się przy C=A*B. Destruktor usuwa zmienną "temp" z funkcji:
cMatrix cMatrix::operator *( const cMatrix & X )
 zanim "zdąży" ona przekazać wartość do funkcji main. Gdy nie ma destruktora wszystko jest ok. Jak rozwiązać problem? Z góry dzięki za pomoc.
P-106277
Monika90
» 2014-03-13 18:18:33
Operator przypisania i konstruktor kopiujacy są błędne. (jak zwykle zresztą)
P-106279
arknaw
Temat założony przez niniejszego użytkownika
» 2014-03-13 18:23:50
A mogłabyś napisać/wyjaśnić jak to powinno wyglądać. O dziwo wszystko jest ok do momentu jak uruchamia się destruktor.
P-106280
Monika90
» 2014-03-13 18:31:30
Konstruktor kopiujacy musi utworzyć kopie swojego argumentu. Tzn. musi przydzielić pamieć na tablicę i skopiować jej zawartość. Podobnie operator przypisania, który na dodatek musi zwolnić dotychczasową tablicę (tutaj najlepiej użyć idiomu copy-and-swap).

A w ogóle jakbyś użył std::vector to by kompilator zrobił to wszystko za ciebie.
P-106281
« 1 »
  Strona 1 z 1