• No results found

2D1387 Programsystemkonstruktion med C++

N/A
N/A
Protected

Academic year: 2021

Share "2D1387 Programsystemkonstruktion med C++"

Copied!
2
0
0

Loading.... (view fulltext now)

Full text

(1)

2D1387 Programsystemkonstruktion med C++

Lösningsförslag, tentamen 22 oktober 2002

Obs: Dessa lösningar är just lösningsförslag. Rättningen kan se något an- norlunda ut.

Uppgift 1

A A B A

Uppgift 2

a) Exempel på program:

template<class T, class It>

T accumulate(T t, It beg, It end) {

for(; beg != end; ++beg) t += *beg;

return t;

}

b) Startvärdet "" kan inte användas med operator+= eftersom man inte kan addera pekare. Lösning på problemet är att använda en standardsträng:

accumulate<std::string>("", b + 0, b + 3) eller

accumulate(std::string(""), b + 0, b + 3). Man kan även skriva en spe- cialisering för accumulate<const char *>.

Uppgift 3

Klassen BigNum för godtyckligt stora tal:

a) Deklarationer:

• BigNum &operator++();

• const BigNum operator++(int);

• const BigNum operator+(const BigNum &) const;

• BigNum &operator+=(const BigNum &);

b) Typer för returvärden och argument:

• Returtyper: const BigNum när ett nytt värde skapats (i t.ex. operator+

ovan). Detta är en temporär och bör inte ändras. Följdaktligen är BigNum överflödig och borde vara const BigNum. BigNum & används när man vill ändra den returnerade variabeln. const BigNum & används när man inte vill kopiera hela objektet men inte vill riskera att någon modifierar datat.

• Argumenttyper: BigNum & tolkas som en variabel som kommer att ändras i funktionen. Argumentet kan därför användas som returvärde eftersom det förmedlar data till anroparen. const BigNum & används när man inte

(2)

vill kopiera hela objektet. BigNum används när man vill ha en kopia för sidoeffekternas skull (ovanligt) eller när datatypen är så liten att referen- sanrop ger onödigt arbete. const BigNum är faktiskt exakt samma sak som att bara ange BigNum. Det är t.ex. ganska vanligt att man anger att en vektorstorlek ska skickas som int i deklarationen och väljer att göra den const int i definitionen för att inte råka ändra värdet.

• Konstanta funktioner: Konstanta objekt kan bara anropa funktioner som är const, dvs funktioner som lovar att inte ändra objektet. Annars skulle ett konstant objekt kunna råka ändras om man anropar en icke-konstant funktion.

c) I en global funktion kan även det vänstra objektet konverteras. Ta t.ex. ad- dition: BigNum b; 1+b;. I detta fall kan inte operator+ anropas om operatorn är en medlemsfunktion. Är operatorn global så används en konstruktor för att konstruera ett BigNumobjekt av 1, och sedan sker addition. Alla operatorer i a går att göra globala. (Däremot går inte tilldelningsoperatorn operator= att gö- ra global, bl.a. eftersom kompilatorn ger denna implicit. Det skulle alltså inte gå att avgöra för kompilatorn om någon har lagt till ytterligare en (global) tilldel- ningsoperator i någon annan implementationsfil, och du skulle få länkningsfel.)

Uppgift 4

a) Alla fyra funktionerna anropas rekursivt för alla medlemar (ex: defaultkon- struktorn kör defaultkonstruktorn för alla medlemmar). Är det en inbyggd typ (t.ex. int eller void *) kopieras datat bitvis. En konstruktor anropar dessutom basklassens konstruktorer. Destruktorn anropar basklassernas destruktorer.

b) Tilldelningsoperator och defaultkonstruktor kan inte skapas eftersom A inne- håller en referens.

A::A(const A &o) : s(o.s), p(o.p), r(o.r), i(o.i) { memcpy(a, o.a, sizeof(a)); /* eller for-loop */ } A::~A() { s.~std::string(); /* kör destruktor */ }

References

Related documents

c) Både deklaration och definition för bar och baz är korrekta trots att de inte överensstämmer helt. Vad är orsaken till att detta är tillåtet? 3p d) Trots påståendet i uppgift

på åtgärd där så är möjligt. För att minska kompileringstiderna och underlätta underhåll vill man undvika beroenden mellan klasser. Vi vill utöka klassen B genom att

När använder man dem som argumenttyp? När bör en funktion vara const? Hänvisa till uppgift a med motivering där så är lämpligt. 6p c) Vilken är anledningen till att man gör

b) Varför kan inte definitioner ligga i headerfilen? 3p c) inline och template är undantag från regeln i deluppgift b). Varför måste. dessa ligga i

b) Vilka effekter uppnås genom att göra konstruktor, destruktor, kopierings- konstruktor, tilldelningsoperator samt operatorerna new och delete till protected

Du vill skapa en trådklass Thread med följande egenskaper: Thread ska när tråden räknat klart frigöra sig själv och får därför inte allokeras på stacken. Trådens arbete ska

Skriv tydligt och ge motiveringar till dina svar. För godkänt krävs 25 poäng, för betyg fyra krävs 34 poäng, för betyg fem krävs 40 poäng. Alla betygsgränser är

Skapa ytterligare en std::map och låt namnet på en aktör vara nyckeln till det objekt aktören representeras av.. När ett kommando verkar på en aktör,använd funktionspekaren