Springen naar inhoud

C++ deep copy constructor


  • Log in om te kunnen reageren

#1

Jekke

    Jekke


  • >250 berichten
  • 997 berichten
  • Ervaren gebruiker

Geplaatst op 23 juli 2010 - 10:15

Ik probeer een matrix klasse te implementeren waarin de elementen als een array zijn opgeslagen:

class matrix

{

public:

typedef double value_type;

typedef size_t size_type;

enum order_t { row_major, column_major };



// Constructor

matrix(size_type nb_rows, size_type nb_cols, value_type init=0, order_t order=row_major)

: n(nb_rows), m(nb_cols), data(new value_type[nb_rows*nb_cols]), ord(order)

{
value_type* temp=data;

for(size_type i=0;i<nb_rows*nb_cols;++i){
*temp=init;

++temp;

}

}



// (Deep) Copy-constructor

matrix(const matrix& other)

: n(other.n), m(other.m), data(new value_type[other.n*other.m]), ord(other.ord)

{
assert(nb_rows()==other.nb_rows() && nb_cols()==other.nb_cols());

//code a
for(size_type i=0;i<n*m;++i){
data[i]=other.data[i];
}
//code b
// for(size_type i=0;i<(n+1)*m+1;++i){
// data[i]=other.data[i];
// }


//alternatieve implementatie
//
// value_type* temp=data;
// value_type* temp_other=other.data;

// for(size_type i=0;i<n*m+10;++i){
// *temp=*temp_other;
//printf("i = %d \n", i);
//printf("a = %f \n", *temp_other);

//printf("b = %f \n", *temp);

// ++temp;
// ++temp_other;
// }


//nog een alternatieve implementatie
// int l=(n+1)*m+1;

// std::copy(other.data, other.data+l, data);
}



// Destructor

~matrix()

{
delete [] data;

std::cout<<"Help I am dying!"<<std::endl;

}



...

protected:

size_type n; // number of rows

size_type m; // number of columns

value_type* data;

order_t ord;

};



// Free functions operating on matrix:


...

Als ik een matrix aanmaak met de constructor en de elementen met een zelf gekozen waarde invul, en die dan afprint, dat werkt. Maar als ik dan een tweede matrix aanmaak met de copy constructor, dan gaat het mis. Met code vult hij de laatste rij niet in, en met code b gaat de laatste rij van de oorspronkelijke matrix ook weer gewijzigd worden (en ik heb geen flauw benul hoe dat kan). Ook de alternatieve implementaties (zie code) geven dezelfde fouten.

ziet iemand wat ik fout doe?

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 23 juli 2010 - 14:09

gebruik [code]-tags en geef een compileerbaar en runbaar stukje code. (En dan bedoel ik een stukje code dat laat zien wat het probleem is.)

Veranderd door EvilBro, 23 juli 2010 - 14:20


#3

Jekke

    Jekke


  • >250 berichten
  • 997 berichten
  • Ervaren gebruiker

Geplaatst op 23 juli 2010 - 16:16

Het probleem is opgelost. Het probleem zat uiteindelijk in mijn data-access functies, waarin ik een fout maakte met mijn pointers.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures