• 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 25 oktober 2001

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

Uppgift 1

7 7 7 B B A (på sex rader)

Medlemsdata har inte polymorfiskt beteende så variabeln i kommer att läsas från typen A.

Uppgift 2

Exempel på program:

template<class T>

std::string sum_elems(const char *s, T it1, T it2) {

return sum_elems(std::string(s), it1, it2);

}

template<class S, class T>

S sum_elems(S ret, T it1, T it2) {

for(T t = it1; t != it2; ++t) ret += *t;

return ret;

}

Överkurs: Motivering till utelämnat const T & är att komplilatorn inte kan avgöra om referenstypen är int * eller int[6] i första anropet till sum_elems.

Detta problem får man inte om man inte använder referenser, eftersom int[6]

då alltid konverterar till int *.

Uppgift 3

Programmet innehåller bl.a. följande konstigheter:

• Semikolon saknas på B1 och B2.

• A1 har privat destruktor vilket gör att variablerna a och b inte kan frigöras med delete.

• Destruktorn i A1 har ingen definition.

• Variabeln a allokeras med new[] och deallokeras med delete vilket ger odefinierat beteende.

• Variabeln d: A2 är inte en basklass till B1.

• Destruktorn i medlemsvariabeln B2::s2 körs inte eftersom basklassen A1 inte har virtuell destruktor. Detta resulterar i en minnesläcka eftersom std::string har dynamiskt allokerat minne.

(2)

Uppgift 4

a) Det är alltid bra att skilja gränssnitt från implementation. Kompileringen går snabbare eftersom implementationsfilerna blir mindre till storleken. Kompi- leringstiderna minskar eftersom beroendena minskar (ta t.ex. extremfallet med endast en .h-fil och en .cpp-fil där allt kompileras om vid varje ändring). Det blir lättare att återanvända delar av koden om inte onödig kod följer med på köpet.

b) Definitioner bör inte ligga i headerfilen eftersom inkludering i flera .cpp-filer då ger multipla definitioner vilket ger länkningsfel.

c) Deras definitioner måste vara synliga vid användningen, annars kan inte inline-funktioner “klistras in” och templates instansieras.

d) Kompilatorn skulle lägga ut information om vilka inline-funktioner och templates som varje .cpp-fil definierar resp. använder. Länkaren samlar upp denna information och avgör vilken .cpp-fil som behöver vilken definition. Kom- pilatorn körs sedan för varje fil som använder inline-funktioner eller templates.

Efter detta måste koden länkas.

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