C++ deep copy constructor
- Berichten: 997
C++ deep copy constructor
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=other.data;
}
//code b
// for(size_type i=0;i<(n+1)*m+1;++i){
// data=other.data;
// }
//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?
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=other.data;
}
//code b
// for(size_type i=0;i<(n+1)*m+1;++i){
// data=other.data;
// }
//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?
-
- Berichten: 7.068
Re: C++ deep copy constructor
gebruik
Code: Selecteer alles
-tags en geef een compileerbaar en runbaar stukje code. (En dan bedoel ik een stukje code dat laat zien wat het probleem is.)
- Berichten: 997
Re: C++ deep copy constructor
Het probleem is opgelost. Het probleem zat uiteindelijk in mijn data-access functies, waarin ik een fout maakte met mijn pointers.