När använder man Derived(Base *) konstruktor? (c++)

Permalänk

När använder man Derived(Base *) konstruktor? (c++)

Hej alla!

I en labb som jag sitter med nu så följer det med en liten testfunktion för att se att allt funkar som det ska. I den funktionen så finns föjande test:

Derived d1; Base & b1 = d1; Derived d2(b1); Base* bp = &d2; Derived d3(bp);

Att han testar tilldelning och copy-constructorn förstår jag. Men den sista raden, dvs en copy-konstruktorn som inte använder & utan * vet jag inte varför han testar. Är det vanligt att man har den konstruktorn och när skulle man ha nytta av den?

Side question: skriver ni constructorn eller konstruktorn? Jag insåg precis att jag hoppar visst för fullt mellan dem.

Visa signatur

Avatarkreds till: http://imgur.com/HOxIL
Alakai säger: Ryssen skrattar. Norrland hembränner på uppdrag av regeringen. Sälar dör i blyförgiftning, fulla och glada. Förvirringen är total. Kungen är nöjd.

Permalänk
Hedersmedlem
Skrivet av Mikael_Berglund:

Är det vanligt att man har den konstruktorn och när skulle man ha nytta av den?

Det känns som att det till exempel är vanligt i gui-ramverk för att ange objekthierarkier.
I Qt kan man till exempel råka ut för

QPushButton* q = new QPushButton(this);

, där this är en QWidget-pekare till till exempel ett QDialog-objekt (både QPushButton och QDialog är underklasser till QWidget).

Skrivet av Mikael_Berglund:

Side question: skriver ni constructorn eller konstruktorn? Jag insåg precis att jag hoppar visst för fullt mellan dem.

Konstruktor är väl en vedertagen svensk term och därmed ser väl alternativa stavningar rätt felstavade ut?

Permalänk
Skrivet av Elgot:

Det känns som att det till exempel är vanligt i gui-ramverk för att ange objekthierarkier.
I Qt kan man till exempel råka ut för

QPushButton* q = new QPushButton(this);

, där this är en QWidget-pekare till till exempel ett QDialog-objekt (både QPushButton och QDialog är underklasser till QWidget).

Hm, troligtvis antar jag att jag blir förvirrad att jag inte riktigt ser skillnaden.

Om man kollar i mitt fall; vanligtvis så definieras en copy-konstruktor såhär:
Derived(const Base & r); ( alt. Derived(const Derived & r); men i fallet som mitt labbpek visar så kanske det är intressant att det är arv inblandat).

Men hans testkod kräver att jag också skapar en
Derived(const Base * r);

Vilket i mitt fall känns helt onödigt, jag kan tänka mig att antingen så säger man att copy-konstruktorn alltid tar pekare eller så tar den alltid referens. Men varför inte bara köra alla anrop via referens? Vad vinner man på att ha en "pekar"-konstruktor (finns det något bra namn för den?), är det inte så att pekare tar lika lång tid men kan föra in mer krångel (pekare till null värden etc.).

Skrivet av Elgot:

Konstruktor är väl en vedertagen svensk term och därmed ser väl alternativa stavningar rätt felstavade ut?

Ok, trodde att det var extrem svensgelska att använda konstruktor. Men då får det bli konstruktor i framtiden.

Glömde const...
Visa signatur

Avatarkreds till: http://imgur.com/HOxIL
Alakai säger: Ryssen skrattar. Norrland hembränner på uppdrag av regeringen. Sälar dör i blyförgiftning, fulla och glada. Förvirringen är total. Kungen är nöjd.

Permalänk
Hedersmedlem
Skrivet av Mikael_Berglund:

Vilket i mitt fall känns helt onödigt, jag kan tänka mig att antingen så säger man att copy-konstruktorn alltid tar pekare eller så tar den alltid referens.

Hm, ja om det alltså var endast kopiering som skulle göras i samtliga fall känns pekarvarianten både ovanlig och onödig. Särskilt om man har chansen att definiera sina gränssnitt själv.