• 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 30 augusti 2001

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

Uppgift 1

a) A(A) kopieringskonstruktor för argumentet a, A() konstruktor för b, A=A ko- piering b = a, ˜A destruktor för a, ˜A destruktor för b.

b) A(A) kopieringskonstruktor för b, A(A) kopieringskonstruktor för c, ˜A de- struktor för b, ˜A destruktor för c.

Uppgift 2

template<class T>

T *my_new(unsigned int count) // undvik neg storlekar {

if(count == 0) // allok. minst ett elem

count = 1;

void *p = malloc(sizeof(T) * count); // allok. minne

if(!p) // slut på minne

throw std::bad_alloc();

T *tmp = static_cast<T *>(p); // iterator

T *ret = new (tmp) T; // returvärde, konstruera

tmp++; // första pos avklarad ovan

for(unsigned int i = 1; i < count; i++, tmp++)

new (tmp) T; // konstruera objekten

return ret;

}

template<class T>

void my_delete(T *p, unsigned int count) {

T *tmp = p; // iterator

for(unsigned int i = 0; i < count; i++, tmp++) tmp->~T(); // kalla dtor explicit

free(p); // frigör minne

}

Uppgift 3

Följande fyra defekter ger kompilatorfel:

• A b = 3.14; Denna syntax, som i övrigt är ekvivalent med A b(3.14), är inte tillåten då konstruktorn är explicit.

(2)

• bar("xyz"); Funktionen bar(A &) får en temporär (implicit skapad av konstruktorn A("xyz")) som argument. Språket tillåter inte icke-konstanta referenser att referera till temporärer.

• foo(3.14) En implicit konvertering genom konstruktion kan inte ske ef- tersom konstruktorn som tar double är explicit.

• foo(A()) En implicit given defaultkonstruktor ges bara av kompilatorn om inga andra konstruktorer deklarerats. Det finns alltså ingen default- konstruktor.

Uppgift 4

a) Man förhindrar användare av klassen att skapa instanser, men i klassen själv och i nedärvda klasser kan man fortfarande skapa instanser och kopior.

b) Några exempel på användningar av protected och private:

• Man kan förhindra objekt på stacken genom att göra destruktorn privat (för att skapa objekt krävs då en s.k. factoryfunktion och en destroy()- funktion som gör delete this).

• Man kan förhindra objekt på heapen genom att göra operatorn new privat.

• Man kan förhindra kopior av ett objekt genom att låta både kopieringskon- struktor och tilldelningsoperator vara private och sakna definition. Vissa objekt lämpar sig inte för kopiering, t.ex. ett objekt av typen ’operativsy- stem’.

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