Gå til innhold

KopiKonstruktor eller assignmentOperator?


Anbefalte innlegg

Skrevet

Har en klasse:

f.eks

class MyClass

.

.

 

så oppretter eg objekter

 

MyClass *ob1 = new MyClass(variable1, osv);

 

Det eg ønsker da er å kunne ta og gjøre følgende

 

MyClass *obj2 = ob1;

 

Dette fungerer, men om eg forandrer på ob1 så blir samme forandringene gjort på obj2. Har en kopikonstuktor, men er itvil om det er nok. Dersom det er nok så har eg en bug i den :(

Videoannonse
Annonse
Skrevet
MyClass *obj2 = ob1;

7849089[/snapback]

 

Burde fungere det, men det kommer ann på hvordan klassen din er bygg, eller rettere sagt åssen variabler du har i klassen. Du nevner en kopikonstuktor og det burde holde, men det kommer som sagt ann på hvordan klassen din ser ut..

 

eks.

obj1 inneholder en peker til variabel 1

man kopierer obj1 til obj2, men obj2 har en peker som peker til noen av de samme dataene som obj1 også har.

 

Hvis du poster variablene dine og eventuelt også kopikonstuktoren din så skal du nok få hjelp.

Skrevet

Klassen

 

class MatrixImage{

public:

MatrixImage();

MatrixImage(char* filename);

MatrixImage(const MatrixImage &mi);

~MatrixImage();

//void operator=(const MatrixImage &mi);

unsigned char* getImageData();

void insert(int row, int col, double value, int channel);

double getValue(int row, int col, int channel);

int getRow();

int getCol();

void writeImage(char* filename);

private:

typedef struct{

unsigned char red;

unsigned char green;

unsigned char blue;

}colorPixel;

imageRGB image;

colorPixel* colorImage;

};

 

Kopikonstruktor:

 

MatrixImage::MatrixImage(const MatrixImage &mi){

image.height = mi.image.height;

image.width = mi.image.width;

delete image.data;

image.data = new uchar[mi.image.height*image.width*3];

 

memcpy(image.data, mi.image.data, (image.height*image.width*3));

 

colorImage = (colorPixel*) image.data;

//memcpy(colorImage, mi.colorImage, (mi.image.width*mi.image.height*3));

 

}

 

Måtte jo prøve litt mer selv først, men det ble ikke bedre.

Skrevet

The rule of three. Copy constructor, assignment operator og destructor. Hvis du har medlemmer som allokeres dynamisk, bør du i nesten alle tilfeller ha en copy constructor, assignment operator og en destructor. Google «the rule of three».

Skrevet
MyClass *ob1 = new MyClass(variable1, osv);

 

MyClass *obj2 = ob1;

 

Dette fungerer, men om eg forandrer på ob1 så blir samme forandringene gjort på obj2

 

Det er ikke så rart, fordi du oppretter her obj2 som en peker til et objekt av typen MyClass, og setter denne lik pekeren ob1.

 

Altså peker du til samme objekt, så om du bruker pekeren ob1 eller obj2 spiller ingen rolle.

 

Du bør bruke en copy constructor, eller så kunne du vel omformulert koden over til:

 

MyClass *ob1 = new MyClass(variable1, osv);
MyClass *obj2 = new MyClass();

*obj2 = *ob1;

delete ob1;
delete obj2;

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...