Avatar billede it-dyret Nybegynder
22. maj 2002 - 15:43 Der er 21 kommentarer og
2 løsninger

Copy-constructor

Jeg har brug for at kunne lave kopier af eksisterende objekter... Hvis man ikke implimenterer en copy-constructor, skulle C++ gerne implicit stille en til rådighed.

Hvis de pågældende objekter indeholder 2 int, og 2 pointere af samme type som den pågældende klasse - er der så noget problem i at anvende den implicitte copy-construktor??? Jeg har læst noget om, at den kopierer primitive datatyper og pointere bitwise, hvilket kan give problemer... men hvilke - og er de der i mit tilfælde?!?

Desuden hvordan ser en copyconstruktor ud, hvis man selv skal lave den? Og hvordan ser kaldet ud til den - hvis man f.eks. har en pointer i forvejen, som man vil have initialiseret til returtypen fra copy-construktoren???
Avatar billede it-dyret Nybegynder
22. maj 2002 - 15:44 #1
Min constructor ser således ud:

TreeNode::TreeNode(int v) {
    value = v;
    balance = BALANCE::BALANCED;
    left = NULL;
    right = NULL;
}
Avatar billede it-dyret Nybegynder
22. maj 2002 - 15:45 #2
første to typer er int's, de andre to er pointere til TreeNode's...
Avatar billede jpk Nybegynder
22. maj 2002 - 15:48 #3
En copy constructor kan du bruge således:

MyClass MC1;
MyClass MC2(MC1); // Får samme værdier som MC1

implementeringen er typisk bare at kopiere attributter fra den ene instans til den anden...
Avatar billede jpk Nybegynder
22. maj 2002 - 15:51 #4
et eksempel:

MyClass::MyClass(MyClass MC)
{
  m_Val1 = MC.m_Val1;
  m_Val2 = MC.m_Val2;
  m_Val3 = MC.m_Val3;
}
Avatar billede it-dyret Nybegynder
22. maj 2002 - 15:52 #5
lidt mere udførligt tak... :)
Avatar billede nejmann Nybegynder
22. maj 2002 - 15:53 #6
Her er også et eksempel med henholdsvis constructor og copyconstructor:

BankKonto::BankKonto(char *n, double s, double r)
{
    ejer = new char[strlen(n)+1];
    assert (ejer != 0);

    strcpy(ejer, n);
    saldo = s;
    renteProcent = r;
}

BankKonto::BankKonto(const BankKonto &e)
{
    cout << "\n\nCopy constructor called\n\n";
    ejer = new char [strlen(e.ejer)+1];
    assert (ejer != 0);

    strcpy(ejer, e.ejer);
    saldo = e.saldo;
    renteProcent = e.renteProcent;

som du kan se minder en copyconstructor meget om constructoren.
Avatar billede it-dyret Nybegynder
22. maj 2002 - 15:54 #7
har nu styr på at lave copy-constructoren... hvornår er det nødvendigt at lave en sådan?? Og hvordan sætter jeg en i forvejen erklæret pointer til at blive instansieret med returværdien fra copy-constructoren??
Avatar billede chries Nybegynder
22. maj 2002 - 15:57 #8
Den copy konstrutor compileren laver, gør memberwise copy som du siger.

det vil sige en ren hukommelses kopieren (1:1). Derfor kan du ikke anvende den ved pointere og reference, da de simpelhen ville pege på de samme "fysike" objekter.

i instance1;
instance1->var = new int(10);

i instance2 = instance1;

instance2->var, instance1->var ville så pege du det samme allokere element, og ville ikke have en kopi hver.
Avatar billede jpk Nybegynder
22. maj 2002 - 15:57 #9
En copy constructor har ikke nogen returværdi!
Avatar billede chries Nybegynder
22. maj 2002 - 15:58 #10
..
i instance2(instance1);
..

.-)

det andet er vist =operator.
Avatar billede jpk Nybegynder
22. maj 2002 - 16:02 #11
>> chries
Næsten sandt, hvis en member er en type der har en copy constructor, bruges denne, ellers kopieres bitvist
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:02 #12
Tror, at jeg har fanget, hvorfor implicit copy constructor ikke spiller... men hvordan sætter jeg (rent syntaktisk) en allerede erklæret pointer til at pege på kopien af det oprindelige objekt (som vel på en eller anden måde kommer tilbage fra copy constructoren - returværdi eller ej)??
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:17 #13
Mangler lidt assistance til, hvordan jeg får det i spil... se sidste spørgsmål! Anyone?!?
Avatar billede jpk Nybegynder
22. maj 2002 - 16:21 #14
En pointer kan du assigne på samme måde som en simpel type

char* pCh1 = new char[10];
char* pCh2 = pCh1;
Avatar billede jpk Nybegynder
22. maj 2002 - 16:24 #15
Mener du sådan?

MyClass::MyClass MC2(const MyClass& MC)
{
  m_pNext = MC;
}
Avatar billede jpk Nybegynder
22. maj 2002 - 16:25 #16
Hvor m_pNext er en attribut at typen MyClass*
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:25 #17
Hvis jeg skal gøre det i en linie, hvor jeg sætter en pointer (f.eks.) p til en kopi af node, hvordan ville det så se ud??
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:28 #18
Yeah!! Hvordan assigner jeg en værdi til en pointer p med ovenstående copy constructor som kopierer MyClass?
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:39 #19
Det kan være, at spørgsmålet allerede er blevet besvaret, men i så fald har jeg ikke lige fanget den... så vi tager fra Adam og Eva :) Min copy-constructor ser nu således nu:

TreeNode::TreeNode(const TreeNode& node) {
    value = node.value;
    balance = node.balance;
    left = node.left;
    right = node.right;
}

Et andet sted har jeg WantedCopyOfNode af typen TreeNode* og Node af typen TreeNode*. Hvordan får jeg taget en kopi af objektet bag Node og sat WantedCopyOfNode til at pege på denne???
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:44 #20
Skal der evt. ændres i min copy constructor?!?
Avatar billede chries Nybegynder
22. maj 2002 - 16:46 #21
WantedCopyOfNode = new TreeNode( *Node );
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:51 #22
Selvfølgelig!!! Synes ellers, at jeg havde prøvet alle muligheder :) Det er sgu en stinker at gå fra Java til C++, men mon ikke Eksperten kan bevare smilene alligevel ;)
Avatar billede it-dyret Nybegynder
22. maj 2002 - 16:58 #23
chries får flest point pga. de mere skarpe svar - eller bedre evne til at gætte en C++ novices kvaler :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester