Lösningsförslag till C++ tenta lördag 22 oktober
1. (a) Gagoh
Daddy says hi Mummy says hi
(b) Koden kan bli tvetydig. T.ex. genom att kommentera bort Baby::hello struct Baby : Mummy, Daddy {
// virtual void hello() { cout << "Gagoh" << endl; } };
Då blir b.hello() tvetydigt
(c) Det finns två Granny delar, en i Mummy och en i Daddy. Därför blir t.ex. b.Granny::hello() tvetydigt. Denna typ av arv kallas dia- mantarv.
2. (a) #include <algorithm>
template <class T>
bool check_duplicates(T begin, T end) { for (T i = begin; i != end; i++) {
if (find(begin, end, *i) != end) return true;
}
return false;
}
(b) check_duplicates kommer bara att titta på adresserna och inte inne- hållet.
(c) template <class T, class S>
bool check_duplicates(T begin, T end, S t) { // Samma som ovan
template <class T>
bool check_duplicates(T begin, T end, const char *) { string tmp;
map<string, int> holder;
for (T i = begin; i != end; i++) { tmp = *i;
if (holder.find(tmp) != holder.end()) return true;
holder[tmp] = 1;
}
return false;
}
Det är OK att bara skriva en specialicering som kompletterar a).
bool check_duplicates(char ** & begin, char ** end) { string tmp;
map<string, int> holder;
for (char** i = begin; i != end; i++) { // Likadant som ovan
1
(d) Båda grenarna av if-satsen måste kompileras och den ena grenen kanske inte går att kompilera, t.ex. tmp=*i när i är en float-pekare och tmp är en sträng.
Man använder if-satsen i run-time inte i compile-time.
template <class T>
bool check_duplicates_d(T begin, T end) {
typedef typename iterator_traits<T>::value_type S;
if (typeid(S) == typeid (char *)) { string tmp;
map<string, int> holder;
for (T i = begin; i != end; i++) { tmp = *i;
if (holder.find(tmp) != holder.end()) return true;
holder[tmp] = 1;
} } else {
S tmp;
map<S, int> holder;
for (T i = begin; i != end; i++) { tmp = *i;
if (holder.find(*i) != holder.end()) return true;
holder[*i] = 1;
} }
return false;
}
3. (a) tal4.cpp:21: error: invalid conversion from ‘Mother*’ to ‘Son*’
tal4.cpp:24: error: invalid conversion from ‘const char*’ to ‘char*’
tal4.cpp:26: error: invalid conversion from ‘void*’ to ‘Mother*’
tal4.cpp:28: error: assignment of read-only data-member ‘Son::christian_name’
(b) dynamic_cast, static_cast, reinterpret_cast och const_cast se bok eller föreläsningsanteckningar.
4. (a) Funktionen test_fighting allokerar spelaren på stacken och fight gör delete på spelaren om spelaren dör.
(b) Man gör delete på ett objekt på stacken.
(c) Monstervektorn innehåller fortfarande ogiltiga pekare som man gjort delete på efter varje fight.
2