Überprüfung einiger Antworten von Testfragen
-
Hallo zusammen,
wir schreiben am Montag einen kurzen Test über unseren aktuellen Kenntnisstand. Heute hat mir einer einige Fragen gesagt, welche ab und an dran kommen. Ich habe alle mal selber beantwortet, bin mir aber nicht sicher und will es deswegen kurz von einem prüfen lassen
Meinte Antworten stehen immer drunter. Danke für das checken!1. Aufgabe:
● Beschreiben Assoziationen „Ist-ein“-Beziehungen?
-Ist eine strukturelle Beziehung zwischen zwei Klassen. Über eine Assoziation kommunizieren diese zwei Klassen untereinander.● Welche Eigenschaft tritt zu einer Assoziation noch hinzu, damit sie zur Aggregation wird?
- Es ist dann eine Aggregation, wenn sich ein Objekt aus ein, oder mehreren Objekten zusammensetzt. Hierbei wird aber auch eine Rangordnung angegeben. Die höheren Objekte setzen sich aus Objekten niedrigeren Rangs zusammen, bzw. Objekte von niedrigem Rang sind ein Teil eines Objekts von höherem Rang.● Welche Eigenschaft tritt zu der Aggregation noch dazu, damit sie eine Komposition wird?
- Das weiss ich nichts und habe auch nichts gefunden…● Können Variablen in verschiedenen Namensräumen den gleichen Namen haben?
- Ja, aber nicht sicher()● Können Variablen in verschiedenen Namensräumen den gleichen Namen aber verschiedene Typen haben?
- Ja.● Kann man in C++ auch int-Werte als Exceptions „werfen“?
- ja.● Muss man in C++ in der Funktionsdeklaration angeben, welche Typen geworfen werden könnten?
- Nein.● Gibt es Ausnahmebedingungen auch in reinem klassischem C?
- Ja, um auch Fehlerhafte Codes zu compelieren. zB. in einem „try-Block“.
-
Beschreiben Assoziationen „Ist-ein“-Beziehungen?
<a href= schrieb:
http://www-home.fh-konstanz.de/~bittel/prog2/Vorlesung/09OOP.pdf (9-4)">Unter einer Assoziation versteht man eine beliebige Beziehung zwischen (den Objekten von) Klassen.
Ergo: Nein.
Können Variablen in verschiedenen Namensräumen den gleichen Namen haben?
Können Variablen in verschiedenen Namensräumen den gleichen Namen aber verschiedene Typen haben?
Kann man in C++ auch int-Werte als Exceptions „werfen“?
Ja. (Kann man einfach testen)
Muss man in C++ in der Funktionsdeklaration angeben, welche Typen geworfen werden könnten?
Nö.
Gibt es Ausnahmebedingungen auch in reinem klassischem C?
<a href= schrieb:
http://stackoverflow.com/questions/2891766/how-to-throw-an-exception-in-c">There are no exceptions in C
-
Marx4 schrieb:
● Welche Eigenschaft tritt zu der Aggregation noch dazu, damit sie eine Komposition wird?
- Das weiss ich nichts und habe auch nichts gefunden…Eine Komposition erhält man, wenn die Klasse die Member besitzt, sprich sie im Konstruktor erzeugt und im Destruktor zerstört. Pointer/Referenzen auf andere Objekte ohne Besitz sind lediglich eine Aggregation.
● Können Variablen in verschiedenen Namensräumen den gleichen Namen haben?
- Ja, aber nicht sicher()Ja, können sie.
● Gibt es Ausnahmebedingungen auch in reinem klassischem C?
- Ja, um auch Fehlerhafte Codes zu compelieren. zB. in einem „try-Block“.?
Es gibt keine Ausnahmen (im Sinne von throw sth) in C, ebenso kein try und catch.
Was meinst du damit.
-
Hi,
danke für die verbesserung!
Hab noch mal ein paar Fragen beantwortet. Währe nett, wenn da noch mal einer kurz drüber schauen könnte
•Zeiger auf eine Klasse XY können auch auf Objekte zeigen, die vom Enkelklassentyp zu XY sind
-Ja, das stimmt.•Referenzen auf eine Klasse XY können NICHT Objekte referenzieren, die vom Typ einer Enkelklasse von XY sind
-Falsch, stimmt nicht•In C++ kann eine Kindklasse höchstens eine Elternklasse haben
-Falsch, stimmt nicht•Stimmen diese Aussagen?
•Bei virtuellen Methoden findet „späte Bindung“ statt.
-Stimmt
•Bei virtuellen Methoden findet „frühe Bindung“ statt
-Stimmt
•Virtuelle Methoden können von Kindklassen neu definiert werden
-Stimmt
•Virtuelle Methoden sind garnicht difiniert, sondenr müssen erst in einer Kindklasse definiert werden
-Falsch•Zeiger auf eine Klasse XY können auch auf ein Objekt zeigen, das vom Typ der Elternklasse zu XY ist.
-Keine Ahnung, würde auf „Wahr, stimmt“ tippen•Stimmen diese Aussagen?
•Kindklassen können in C++ neue Methoden zu den geerbten hinzufügen
-Stimmt
•Kindklassen dürfen in C++ geerbten Funktionen NICHT neu definieren/ überschreiben
-Falsch
•Kindklassen können in C++ neue Attribute zu den geerbten hinzufügen
-Falsch
•Kindklassen dürfen methoden der elternklasse „löschen“. Die Kindklasse besitzt dann keine solche Methode
-Falsch•Diese Frage bezieht sich auf die doppelt verkettete Liste aus der Vorlesung: Bitte schreiben Sie die Definition der Methode „void List::add(ListElement *neu, ListElement *wohin“ auf. Diese methode soll ein neues Element (neu) in die bestehende Liste einknüpfen. Die Position ist hinter dem Element, auf das wohin zeigt. Ist wohin==0, so soll da sneue Element ganz an den Anfang der Liste eingefügt werden. Es kann davon ausgegangen werden, dass die bestehende Liste korrekt angelegt ist. Die Methode soll funktionieren, egal an welcher Stelle das Element eingefügt werden soll und egal ob es das erste Element in der Liste überhaupt ist oder nicht. Schreiben Sie eine komplette C++ Methode.
-So nun mein Programmvorschlag:
void List::add(ListElement *neu, ListElement *wohin)
{
If(!neu)
Return;
If(wohin)
{
neu-> next = wohin -> next;
wohin -> next=neu;
}
else
{
neu -> next = start;
start= neu;
}
neu ->next = start;
start =neu;
}
neu -> prev = wohin;
if (neu -> next)
neu -> next -> prev = neu;
else
end = neu;
}Das Thema ist nciht gerade meine stärke. Muss ja nicht ein komplett Perfekter Code sein^^
-
Marx4 schrieb:
Hi,
danke für die verbesserung!
Hab noch mal ein paar Fragen beantwortet. Währe nett, wenn da noch mal einer kurz drüber schauen könnte
•Zeiger auf eine Klasse XY können auch auf Objekte zeigen, die vom Enkelklassentyp zu XY sind
-Ja, das stimmt.•Referenzen auf eine Klasse XY können NICHT Objekte referenzieren, die vom Typ einer Enkelklasse von XY sind
-Falsch, stimmt nicht•In C++ kann eine Kindklasse höchstens eine Elternklasse haben
-Falsch, stimmt nicht•Stimmen diese Aussagen?
•Bei virtuellen Methoden findet „späte Bindung“ statt.
-Stimmt
•Bei virtuellen Methoden findet „frühe Bindung“ statt
-Stimmt
•Virtuelle Methoden können von Kindklassen neu definiert werden
-Stimmt
•Virtuelle Methoden sind garnicht difiniert, sondenr müssen erst in einer Kindklasse definiert werden
-Falsch•Zeiger auf eine Klasse XY können auch auf ein Objekt zeigen, das vom Typ der Elternklasse zu XY ist.
-Keine Ahnung, würde auf „Wahr, stimmt“ tippen•Stimmen diese Aussagen?
•Kindklassen können in C++ neue Methoden zu den geerbten hinzufügen
-Stimmt
•Kindklassen dürfen in C++ geerbten Funktionen NICHT neu definieren/ überschreiben
-Falsch
•Kindklassen können in C++ neue Attribute zu den geerbten hinzufügen
-Falsch
•Kindklassen dürfen methoden der elternklasse „löschen“. Die Kindklasse besitzt dann keine solche Methode
-Falsch•Diese Frage bezieht sich auf die doppelt verkettete Liste aus der Vorlesung: Bitte schreiben Sie die Definition der Methode „void List::add(ListElement *neu, ListElement *wohin“ auf. Diese methode soll ein neues Element (neu) in die bestehende Liste einknüpfen. Die Position ist hinter dem Element, auf das wohin zeigt. Ist wohin==0, so soll da sneue Element ganz an den Anfang der Liste eingefügt werden. Es kann davon ausgegangen werden, dass die bestehende Liste korrekt angelegt ist. Die Methode soll funktionieren, egal an welcher Stelle das Element eingefügt werden soll und egal ob es das erste Element in der Liste überhaupt ist oder nicht. Schreiben Sie eine komplette C++ Methode.
-So nun mein Programmvorschlag:
void List::add(ListElement *neu, ListElement *wohin)
{
If(!neu)
Return;
If(wohin)
{
neu-> next = wohin -> next;
wohin -> next=neu;
}
else
{
neu -> next = start;
start= neu;
}
neu ->next = start;
start =neu;
}
neu -> prev = wohin;
if (neu -> next)
neu -> next -> prev = neu;
else
end = neu;
}Das Thema ist nciht gerade meine stärke. Muss ja nicht ein komplett Perfekter Code sein^^
-Ja, Zeiger können (nur) nach unten zeigen.
-Nein, Referenzen können (nur) nach unten zeigen.
-Nein, beliebig viele.
-Ja, Nein, Ja, Nein
-Nein, Zeiger können nur nach unten zeigen. (oder eben auf den Zeigertyp)
-Ja, Du kannst nur das überschreiben was virtuell ist und sonst nichts, ja, nein
-
Marx4 schrieb:
Hallo zusammen,
● Gibt es Ausnahmebedingungen auch in reinem klassischem C?
- Ja, um auch Fehlerhafte Codes zu compelieren. zB. in einem „try-Block“.man kann das mit den Funktionen setjmp und longjump Exeptions in C bauen.
Allerdings wird in C meistens mit Rückgabewerten gearbeitet, wobei einfach ein FALSE oder -1 zurückgegeben wird, um einen Fehler zu signalisieren.ich denke mal, wenn du einfach "nein" antwortest ist das schon ok.
-
Marx4 schrieb:
•Kindklassen dürfen methoden der elternklasse „löschen“. Die Kindklasse besitzt dann keine solche Methode
-FalschKomplett löschen geht nicht. Es kann allerdings eine öffentliche Methode der Elternklasse private überschrieben werden. Dann kann diese Methode nicht "von außen" über die Kindklasse aufgerufen werden. Ein Aufruf über einen Basisklassenpointer ist allerdings weiterhin möglich.
Marx4 schrieb:
•Diese Frage bezieht sich auf die doppelt verkettete Liste aus der Vorlesung: Bitte schreiben Sie die Definition der Methode „void List::add(ListElement *neu, ListElement *wohin“ auf. Diese methode soll ein neues Element (neu) in die bestehende Liste einknüpfen. Die Position ist hinter dem Element, auf das wohin zeigt. Ist wohin==0, so soll da sneue Element ganz an den Anfang der Liste eingefügt werden. Es kann davon ausgegangen werden, dass die bestehende Liste korrekt angelegt ist. Die Methode soll funktionieren, egal an welcher Stelle das Element eingefügt werden soll und egal ob es das erste Element in der Liste überhaupt ist oder nicht. Schreiben Sie eine komplette C++ Methode.
-So nun mein Programmvorschlag:
void List::add(ListElement *neu, ListElement *wohin) { If(!neu) Return; // schreibt man klein If(wohin) { neu-> next = wohin -> next; wohin -> next=neu; // hier richtig } else { neu -> next = start; // ist "start" global verfügbar? start= neu; } neu ->next = start; // was soll das hier? start =neu; } // hier ist die Methode zu ende??? copy/paste Fehler? neu -> prev = wohin; if (neu -> next) // unnötig. neu->next ist entweder wohin (falls wohin!=null) oder start neu -> next -> prev = neu; else end = neu; // ist "end" global verfügbar? }nur ein paar Anmerkungen. Da ist vermutlich noch mehr falsch, aber das lässt sich nicht ohne Kenntnis der Liste aus Eurer Vorlesung sagen.
-
•Bei virtuellen Methoden findet „späte Bindung“ statt.
-Stimmt
•Bei virtuellen Methoden findet „frühe Bindung“ statt
-StimmtEs koennen nicht beide Aussagen stimmen.
-
exCeptions schrieb:
Marx4 schrieb:
Hallo zusammen,
● Gibt es Ausnahmebedingungen auch in reinem klassischem C?
- Ja, um auch Fehlerhafte Codes zu compelieren. zB. in einem „try-Block“.man kann das mit den Funktionen setjmp und longjump Exeptions in C bauen.
Allerdings wird in C meistens mit Rückgabewerten gearbeitet, wobei einfach ein FALSE oder -1 zurückgegeben wird, um einen Fehler zu signalisieren.ich denke mal, wenn du einfach "nein" antwortest ist das schon ok.
Es gibt signal/raise/SIGUSR1(2), und damit lässt sich ein try/catch simulieren.
Und das ist reines klassisches C, also C89.
-
Wutz schrieb:
Es gibt signal/raise/SIGUSR1(2), und damit lässt sich ein try/catch simulieren.
Und das ist reines klassisches C, also C89.Da staune ich und bin ein wenig ungläubig.
-
Wutz schrieb:
Es gibt signal/raise/SIGUSR1(2), und damit lässt sich ein try/catch simulieren.
Dir ist nicht so richtig klar, wie Exceptions funktionieren, oder?
Einen Verweis auf longjmp hätte ich noch nachvollziehen können; damit (und mit viel Aufwand) könnte man so etwas wie Exceptions in C bauen (nicht, dass man es wollen sollte), aber signal? Mit Signalen, die einem von außen geschickt werden können? Erstens springst du nachher an die selbe Stelle zurück, von der du gekommen bist, und zweitens wäre das selbst dann völliger Wahnsinn, wenn es funktionieren könnte.