Kopering af en vector

Tags:    c++

<< < 12 > >>
Hej udvikleren.dk

Jeg har denne operator=()
Fold kodeboks ind/udKode 

Den indholder ikke ret meget, det ved, men alt hvad jeg har forsøgt mig med har resulteret i en "segmentation fault" eller andet mærkeligt.
Job har en
Fold kodeboks ind/udKode 

og når man sætter jo forskellige job objekter lig hinanden fx.
Fold kodeboks ind/udKode 

Så skal der ske en kopiering af denne vector, men hvordan?
Jeg har snart prøvet alt. Jeg har prøvet med utallige forskellige for-løkker som bruger memcpy, eller en obskur form indholdende new og en masse pointere, men lige meget virker det.
Jeg ville høre om der var en som kunne give mig den lede tråd, som peger mod oplysning.





18 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
job1 og job2 er begge pointere, så:
job2 = job1;
Sætter blot job2 til at pege på det samme som job1 peger på.

Det er i sig selv ikke farligt, men du har nu to pointere der peger på det samme (og ingen der peger på det job2 pegede på).
Men det kan give problemer når du skal frigive hukommelsen.
Du assignment operator bliver ikke kaldt.

Hvis du vil kopiere indholdet af job1 over i job2, skal du:
*job2 = *job1;



Men hvordan får jeg kopieret vektoren? Jeg har også en anden member i job klassen, en jobTask data member.
Fold kodeboks ind/udKode 


Og job task skal jeg vel også kopierer med operator=() kaldet. Lige nu er jeg i tvivl på hvordan jeg skal gøre det, må jeg ærligt indrømme. Er det ikke bare at oprette en ny instants af en task. Tror jeg har mistforstået hele konceptet ved operator overloading.



Min fejl :) Jeg har selvfølgelig ikke oprettet job1 og job2 som pointere!! De er oprettet sådan her,

Fold kodeboks ind/udKode 


Jeg er dog stadig i tvivl om hvordan man nu skal kopierer de data members der er med (vector og task). Jeg troede bare at det kunne gøre ved at bruge memcpy. Men det har, for mig, ikke virket.



Det eneste du med sikkerhed kan kopiere med memcpy er rene POD.
vector'er og class'er (hvis de indeholder andet end POD) skal kopieres "by-hand".



Og med "by-hand" men du noget i stil med

Fold kodeboks ind/udKode 


Her gør jeg jo brug af copy constructoren, jeg bruger ikke memcpy og jeg opretter et nyt objekt og giver den til mit job objekt.
Så mangler jeg vel bare at kopierer min vektor på samme måde. Bare med en for løkke.
At jeg så bruger en copy constructor, betyder vel at jeg også skal til at definere den for min task klasse? Eller er det lige meget så længe min klasse ikke indholder nogen pointere? Jeg kan jo godt bare lade min task's default copy constructor tage sig af den shallow kopiering der sker.



Indlæg senest redigeret d. 15.08.2007 12:00 af Bruger #1151
Jeg skal vel egentlig også delete det som først bliver peget på af min jobTask. For jeg sætter den til at pege på en default task i jobbets ctor.
Jeg burde vel egentlig også passe på at der ikke sker en
job1 = job1 ?
:O Og jeg burde vel også fange en evt exception så jeg kan delete mine objekter ordentlig, hvis en fejl skulle ske ved kopieringen?



Indlæg senest redigeret d. 15.08.2007 12:40 af Bruger #1151
Jeg har prøvet at lave en test klasse som gør brug af en operator=(), uden at kontrollere efter exceptions og l value og r value er den samme.

Fold kodeboks ind/udKode 


Ser det galt ud?



Indlæg senest redigeret d. 15.08.2007 13:49 af Bruger #1151
Det ser egentlig ok ud. Der er et par småting.

I add(int *) tilføjer du én int, i så fald burde det være nok med: add(int ), så slap du også for at myClass arver det parametren peger på.

copy constructoren og assignment operatoren ligner hinanden, du burde flytte koden til én funktion.



Er det ikke meningen at de skal lige hinanden? Jeg forstår ikke helt hvad du mener med add memberen :) Kan du prøve at omformulere det? Vil du have at det bare skal være en regulær int og ikke en pointer til en int?



Bertel << Angående følgende kodestump:
Fold kodeboks ind/udKode 

Altså jeg new'er jo, men skal jeg så ikke også delete?



<< < 12 > >>
t