Tentamen i 2D1387 Programsystemkonstruktion med C++
Datum:9 januari 2003
Hjälpmedel:Valfri lärobok i C++
Tid: 5 timmar
Skriv tydligt och ge motiveringar till dina svar. 25 poäng ger garanterat god- känt. Maxpoäng är 45.
1. Betrakta följande program:
struct A {
virtual void foo() { std::cout << "A"; } };
struct B : public A { B() : a(this) {}
void foo() { std::cout << "B"; } A *a;
};
A a;
B b;
A &ar = b;
a.foo();
b.foo();
ar.foo();
b.a->foo();
Vad skriver programmet ut när man kör det? Motivera ditt svar. 8p 2. Mallfunktionerna max och min jämför två element med operator< och retur- nerar det största resp. minsta elementet. Mallfunktionen swap byter värde på två variabler. Exempel:
int j;
int i = min(1, 2);
A a, b;
A c = max(a, b);
swap(a, b);
Vector v, w; // Vector från lab 1 swap(v, w);
a) Implementera max och min. 6p
b) Implementera swap. 5p
c) Anropet swap(v, w) ovan är onödigt ineffektivt eftersom vektorerna ko- pieras elementvis. Implementera en specialisering swap<Vector>(v, w) som på ett effektivt sätt byter innehållet i de två vektorerna. 6p
1
3. Nedanstående program går inte att kompilera. Peka ut felen och ge förslag
på åtgärd där så är möjligt. 10p
class A {
static int i;
int j;
public:
virtual void foo() {}
};
struct B : public A {
B(int i) { c = i; j = i; } private:
virtual void foo() {}
};
int main() {
A a;
B b;
a.i = 7;
b.j = 3;
A &ar = b;
ar.foo();
return 0;
}
4. För att minska kompileringstiderna och underlätta underhåll vill man undvika beroenden mellan klasser. Vi vill utöka klassen B genom att återanvända delar av klassen A. Om A är basklass till B måste As definition vara synlig när B definieras.
För att undvika detta kan man i många fall låta B innehålla en pekare till ett A-objekt och begränsa användandet av A till implementationsfilen.
a) Vad är nackdelarna (i resurser såsom tid och minne) med ovanstående
teknik? 4p
b) Virtuella funktioner i A kan bara överskrivas genom arv. Räkna upp ytterli- gare fall där arv är mer fördelaktigt än tekniken ovan. Uppfinningsrikedom
kan ge bonuspoäng. 6p
2