PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ unklarheiten.


Ganon
2003-12-09, 17:56:10
Hi.

Ich bin´s. Mal wieder. Neuer Tag, neue Fragen. *ggg*

Nun geht es aber mal um C++.

Und zwar sind bei mir noch folgende Sachen ungeklärt:

1. Wie weit kann man mit einem Konstruktor einer Klasse gehen? Als ich nämlich versucht habe ein OpenGL-Modell in eine OpenGL-Liste (glNewList) im Konstruktor zu erzeugen, dann ist mir das Programm beim Erstellen des Objektes mit Signal 10 abgeschmiert.

2. Man kann ja Objekte auf 2 verschiedene Arten erzeugen.
Einmal mit:

Klasse Objekt;


und einmal mit:

Klasse *Objekt = new Klasse();


Mein Lehrer sagt, das er nur die 2. Version von uns sehen will. Nun wollte ich fragen, ob er das will, weil er weiß das das besser ist, oder ob er das will, weil Borland es so macht.
Was für Vor/Nachteile haben denn die beiden Versionen?

3. Wenn ich globale Variablen habe, die ich an eine Klassen-Methode übergeben möchte. Was schreibe ich dann besser in die Methodendefinition?

Methode(int a, int b, int c)

oder

Methode(int *a, int *b, int *c)

oder

Methode(int &a, int &b, int &c)

Den 3. Punkt habe ich jetzt aber nur so hingeschrieben. Von Referenzen habe ich noch keine Ahnung, was die machen.


Danke.

zeckensack
2003-12-09, 18:16:45
1/2)globale Objekte werden beim Laden des Programms initialisiert (ie Konstruktor-Aufruf). Das ist in vielen Fällen zu früh (zB bei Klassen, die OpenGL-Dienste brauchen; der GL-Kontext muß erstmal stehen ...).

Pointer=new Class() erlaubt dir also primär die genauere Kontrolle über den Zeitpunkt des Konstruktor-Aufrufs. IMO war es das, was dein Prof im Sinn hatte.

3)Es kommt darauf an ;)
a)Methode(int a, int b, int c)
Übergibt Kopien der Werte. Die Methode kann die Funktionsparameter auf diese Weise nicht dauerhaft verändern (die Kopien werden beim Verlassen der Methode wieder verworfen; jedoch kann sie im Zweifelsfall immer noch direkt auf die globalen Variablen zugreifen).

b)Methode(int *a, int *b, int *c)
Die Methode kann die Werte hinter den Zeigern dauerhaft verändern.

c)siehe b, allerdings ist die Syntax anders. Eine Referenz wird wie ein Wert (!=Zeiger) benutzt, verhält sich aber intern wie ein Zeiger.

zB
int g_x=10;
int g_y=20;

void
gnarf(int& a,int& b)
{
a+=b;
b=0;
}

int
main()
{
printf(%d\t%d\n",g_x,g_y);
gnarf(g_x,g_y);
printf(%d\t%d\n",g_x,g_y);
return(0);
}
Ausgabe:

10 20
30 0
Man beachte die Abwesenheit jeglicher Dereferenzierungs- und "address of"-Operatoren.

Demirug
2003-12-09, 18:35:10
Noch etwas zu 2:

Mit "Klasse *Objekt = new Klasse();" wird ein Objekt immer im dynamischen Speicher angelegt und muss auch wieder mit delete freigegeben werden.

Bei "Klasse Objekt;" hängt es davon ab wo man das ganze benutzt. Benutzt man diesen Code auserhalb einer Funktion wird vom Compiler für das Objekt im Datensegment Speicher reserviert. Innerhalb einer Funktion landet das Objekt auf dem Stack. In beiden Fällen werden aber Konstruktoren und Desturktoren aber automatisch ausgefürt.

Diese Eigenschaft kann man sich nun ehr gut zu nutze machen. Gerade innerhalb einer Funktion sind auf dem Stack angelegte Objekte sehr praktisch. Benutzt man zum Beispiel eine Fileklasse die im Desturktur das File wieder schliesst kann man sicher sein das beim Verlassen der Funktion die Datei auf jeden Fall wieder geschlossen wird. Das Verfahren kann man für jede Art von Resource anwenden.

Die Alternativen (goto;tiefe If-Cascaden) sehen IMHO dagegen richtig übel aus. Leider hat man C++ ja keine Finaly bzw Epiolog Technik spendiert mit der man das richtig elegant lösen kann.

PS: globale Variablen sind böse. Ich habe mir angewöhnt nur Globale Objekte welche diese Variablen enthalten zu benutzten. Da der Zugriff nur über die Memberfunktionen möglich ist kann man sich da nicht so leicht selbst ins Knie schiessen.

Gast
2003-12-09, 21:33:25
Kleine Ergänzung zu 2:
Der Lehrer hat entweder keine Ahnung oder er will Euch nicht mit näheren Details zu C++ überfordern.
Nach meiner eigenen Erfahrung müßte ich auf ersteres tippen, aufgrund der Sachlage tippe ich aber auf letzteres. Mit Pointern kann man prinzipiell alles machen, mit auf dem Stack angelegten Objekten nicht, die sind nur u.U. praktischer und schneller.

Kleine Ergänzung zu Demirugs PS:
Ein Stück Code hat keine Gesinnung, weder eine gute, noch eine böse ;)
Jedenfalls ist es didaktisch geschickter, zu erläutern, warum bestimmte Konstrukte gefährlich sind, als über gut und böse zu sinnieren.
Und irgendwie ist ein Singleton ja doch eine globale Variable...

Nagilum
2003-12-09, 22:11:59
Original geschrieben von Gast
Und irgendwie ist ein Singleton ja doch eine globale Variable...
Zwischen einer geschützten Klassenvariable und einer "Jeder-darf-mal-ran"-Variable ist aber noch ein deutlicher Unterschied.

Gast
2003-12-09, 22:56:02
Zwischen einer geschützten Klassenvariable und einer "Jeder-darf-mal-ran"-Variable ist aber noch ein deutlicher Unterschied.
An einen Singleton darf auch jeder mal ran. Man kann dem Singleton bloß nix neues zuweisen oder einen zweiten Singleton erstellen.
Wenn man die Variable statt als private Klassenvariable als statische, lokale Variable der Zugriffsmethode anlegt, kann man außerdem noch den Erstellungszeitpunkt kontrollieren.
Ein Singleton ist somit quasi eine geschützte und/oder bezüglich der Funktionalität erweiterte globale Variable.

Nagilum
2003-12-09, 23:24:46
Original geschrieben von Gast
Man kann dem Singleton bloß nix neues zuweisen

Und allein das macht einen deutlichen Unterschied zu einer globalen Variable aus, find ich. Fehler mit globalen Variablen resultieren ja meist nicht aus Abfragen, sondern aus unkoordinierten Modifikationen derselben.

Global heisst für mich: Jeder kann mit der Variable anstellen was er will. Da ich den Wert eines Singleton nicht global ändern kann, ists für mich auch keine globale Variable.

Gast
2003-12-10, 01:07:46
Tja und für mich ist das Kriterium "global" schon erfüllt, wenn jeder darauf zugreifen kann.
So ist das eben mit solchen Definitionen ;)

Aber mir gings ja eh nur um diese "arr, das ist böse" Angewonheit vieler Informatiker - die finde ich nämlich böse ;)
Viele scheinen das Programmieren als eine religiöse Tätigkeit anzusehen...