10 C++ Testfragen
-
c++fan 2008 schrieb:
Für das nachträgliche Auseinanderklambüsern kannst du zum Beispiel dynamic_cast<> benutzen.
Wieso sollte man das auseinandernehmen? Durch virtuelle Methoden, die in der Basisklasse deklariert wurden, kann man für jedes Objekt die richtige Funktionalität erzielen.
-
SCNR vorab.
1. von 7N3 N43CR: Warum kann ein char** nicht einem const char** zugewiesen werden?
2. Welche Schwachstellen fallen in folgender Methode auf, und wie sollte man sie am besten beheben?
#include <cstdio> struct data_t { int val1; int val2; double val3; void loadFromFile (const char* filename) { static const char* signature = "MYDATAFORMAT"; std::FILE* file = std::fopen (filename, "rb"); if (!file) throw "File not found (or so)"; unsigned siglen = std::strlen (signature); char* sigbuf = new char[siglen]; std::fread (sigbuf, std::strlen (signature), 1, file); if (std::strcmp (signature, sigbuf) != 0) throw "Unknown file format!"; std::fread (this, sizeof (data_t), 1, file); std::fclose (file); delete sigbuf; } };
3. von Nexus: Worin bestehen die Vorteile von std::list gegenüber std::vector? Zähle drei wesentliche auf. (Allerdings wäre es vielleicht besser, einen begründeten, aber wertungslosen Vergleich zu fordern.)
4. Was genau bewirkt diese Anweisung?
((void(*)())0)();
5. Was passiert, wenn dieses Programm ausgeführt wird?
#include <iostream> struct Base; void printClassName (const Base* obj); struct Base { virtual const char* getClassName (void) const = 0; // abstrakte Basisklasse Base (void) { printClassName (this); } virtual ~Base (void) { printClassName (this); } }; void printClassName (const Base* obj) { std::cout << "This is a '" << obj->getClassName () << "'" << std::endl; } struct Derived : Base { virtual const char* getClassName (void) const { return "Derived"; } }; int main (void) { Derived d; Base* b = &d; std::cout << "This is a " << b->getClassName () << std::endl; }
6. Konvertieren Sie diese Zeile in intuitiv lesbaren Code.
int (*foo (bool)) (char);
Das ist ungefähr aufsteigend nach Schwierigkeitsgrad sortiert und reicht fürs erste.
Edit: Untenstehender Anmerkung von Phoemuex entsprechend Frage Nr. 5 angepaßt.
Für 7.-10. wären wahrscheinlich ein paar template-bezogene Fragen sinnvoll.
-
audacia schrieb:
(Allerdings wäre es vielleicht besser, einen begründeten, aber wertungslosen Vergleich zu fordern.)
Hab ich mir auch überlegt, aber dann würde vielleicht vielen nur ein Argument einfallen. Man kann schliesslich auch 3 Vorteile nennen und begründen.
Aber ich finde deine Liste recht gut, zum Teile habe ich auch Mühe damit.
-
audacia schrieb:
5. Was passiert, wenn dieses Programm ausgeführt wird?
#include <iostream> struct Base { virtual const char* getClassName (void) = 0; // abstrakte Basisklasse Base (void) { std::cout << "Constructing a '" << getClassName () << "' object" << std::endl; } virtual ~Base (void) { std::cout << "Destroying a '" << getClassName () << "' object" << std::endl; } }; struct Derived : Base { virtual const char* getClassName (void) { return "Derived"; } }; int main (void) { Derived d; Base* b = &d; std::cout << "This is a " << b->getClassName () << std::endl; }
Nichts, denn (mit einem vernünftigen Compiler) linkt es erst gar nicht.
Felix
-
Phoemuex schrieb:
Nichts, denn (mit einem vernünftigen Compiler) linkt es erst gar nicht.
Aah, richtig.
Also eine kleine Indirektion mehr, und schon geht es. Ich trage es oben nach.
-
audacia schrieb:
2. Welche Schwachstellen fallen in folgender Methode auf, und wie sollte man sie am besten beheben?
#include <cstdio> struct data_t { int val1; int val2; double val3; void loadFromFile (const char* filename) { static const char* signature = "MYDATAFORMAT"; std::FILE* file = std::fopen (filename, "rb"); if (!file) throw "File not found (or so)"; unsigned siglen = std::strlen (signature); char* sigbuf = new char[siglen]; std::fread (sigbuf, std::strlen (signature), 1, file); if (std::strcmp (signature, sigbuf) != 0) throw "Unknown file format!"; std::fread (this, sizeof (data_t), 1, file); std::fclose (file); delete sigbuf; } };
Alles neu schreiben.
-
- for-Schleife in while-Schleife umwandeln
- Nicht-rekursive Lösung in rekursive umwandeln
- Bit-Logik-Aufgabe stellen
- String-Klasse entwerfen lassen
- Template-Klasse entwerfen lassen
- try-catch-throw
- Singleton-Klasse schreiben lassen
- Beispiele aus STL, vor allem algorithm http://www.cplusplus.com/reference/algorithm/
...
-
waaaa schrieb:
Alles neu schreiben.
Schon klar.
Aber eine wichtige Kompetenz ist, sowohl Schwachstellen als auch Ausbesserungsmöglichkeiten konkret benennen zu können.
-
audacia schrieb:
unsigned siglen = std::strlen (signature); // Dieser Fehler ist wohl nicht auszumerzen, // oder warum muß er immer wieder gemacht werden?
Siehe Code
-
ProggaJens schrieb:
0.wieso fange ich bei 0 an zuzählen statt bei 1?
1.kann ich c++ auch auf einen mac problem los benutzen?
2.steht int für international? :p
3.kam c++ vor c?
4.welche person hat c++ geschaffen?^^
5.kannst du mir sagen wie groß ein array maximal ist?^^
6.gehören true und false in c++ zur variablen klasse int, double oder bool?
7.was ist hier dran falsh "double = 1,0;" ?
8. heißt es "if" und "else" oder "if" und "or"
9."int main()" oder "int main(int nNumberofArgs, char pszArgs[])" ?^^*Man sollte hier aber noch erwähnen, dass dies keine "entweder oder" Frage ist.
-
Scherzkeks schrieb:
Man sollte hier aber noch erwähnen, dass dies keine "entweder oder" Frage ist.
Ich glaube sowieso nicht, dass diese 10 Fragen ernst zu nehmen sind...
-
Noch eine schöne Frage:
Welche Ausgabe hat folgendes Programm?#include <iostream> void f( int a[5]) { std::cout << sizeof(a) << std::endl; } int main() { int a[5] = {}; f( a); return 0; }
(bevor sich jemand beschwert, die Antwort muss keine absolute Größe sein)