1) template bool backwards(T p, S q, unsigned int l) { for (unsigned int i = 0; i < l; i++, ++p, --q) { if (*p != *q) return false; } return true; } 2) a) TheWorld::foo() b) TheMatrix::foo() c) TheWorld::foo() d) TheWorld::foo() TheMatrix::foo() Notera att man returnerar en TheMatrix kopia. Den används i sista utskriften. Det var olyckligt att koden hamnade på olika sidor på tentan. 3 Den här uppgiften var väldigt lik första labben. De som jobbat med lab1 hade inga problem att typparametrisera klassen eller lägga till operator= och destruktor. Det finns en bug i koden, den var faktiskt avsiktlig. Jag tänkte ge det som kompletteringsuppgift men jag ångrade mig efteråt. a) Inte så svårt. I princip följande ändringar. Interna vektorn ändrar typ int * vec -> T * vec Allokeringen ändras new int -> new T Åtkomstoperator returnerar T int operator() -> T operator Ovanstående är väldigt kortfattat, för kortfattat för ett tentasvar. T.ex. framgår inte om man förstått att det finns två operator() som båda ska ändras eller att det finns fler ställen som allokerar vektorn. Svaret tolkas till er nackdel om ni inte är tydliga. Defaultkonstruktorn som nämns explicit är kopplat till uppgift e. b,c) Kopiekonstruktor finns men operator= och destructor saknas. Att sakna denna insikt är ett grovt fel. d) Slå upp svaret i boken. En del gamla böcker påstår att new returnerar null när minnet är slut, det är fel ... överväg att byta bok om det står så ... man kan sätta ett sådant beteende för operator new med nothrow. e) Defaultkonstruktorn (som man själv skrivit i uppgift a) kommer att initiera 16 miljoner element. Medlemsvariabler intieras med defaultkonstruktorn om man inte konstruerar dem på något annat sätt i initieringslistan. Om klassen TheMatrix vill ha en 5x5 matris är det onödigt att först skapa den stora defaulmatrisen och därefter ändra storlek. f) Returvärdet Matrix & är väldigt konstigt. Om man returnerar en referens till sig själv som man förändrat borde operator+ fungera som operator+= Om man kedjar operationerna vad betyder det? Är a + b + c samma som a += b += c ? g) Uppgift g) är en enkel uppgift som testar om man kan deklarera vettiga operatorer. Tänk på argumenten och returvärdena så det inte blir lika tokigt som i uppgift f). Man måste kunna förklara dem lämpligen med ett exempelanrop. Man ska kunna använda const korrekt om så behövs. h) Man kan använda det logiska problemets syntax istället för programmeringsspråkets syntax. a.addequals(b.add(c)) vs a += b + c 4) 1) a = a; A::operator=(A) körs 2) a = b; A::operator=(B) körs 3) b = a; B::operator=(A) körs 4) b = b; B::operator=(B) körs 5) b = c; B::operator=(B) körs 6) a = c; A::operator=(B) körs 7) a.m = 10 8) b.m = 11 9) c.m = 12 Det här var inte så svårt tal. De flesta klarade a). Det var tillåtet med ett enstaka fel i utskriften. Man kan få för sig att A::operator=(const A &) alltid ska köras men den är överskuggad i det här talet. b) Eftersom det inte finns någon pekare eller referens i huvudprogrammet kan det inte bli någon polymorfi i runtime. Det blir således ingen skillnad i utskrifterna om man lägger till virtual. Svarar man tvärtom är det ett grovt fel. c) För att nå basklassens metoder använder man synlighetsoperatorn (scope operator) A::operator=