PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Objektinstanzierung (Split aus :Medienberichte über die Geiselnahme in Moskau)


Xmas
2002-11-03, 16:44:19
Originally posted by grakaman
tbird kleinertroll = new tbird();
Ich *hasse* diese Art der Instanzierung... völlig unlogisch sowas.


Originally posted by TBird
;D
Wie ich vermutet habe -> keinen Schimmer von Entwicklungshilfe.
Schade...
Dann erkläre doch mal deine Sicht.

grakaman
2002-11-03, 18:01:11
@ xmas

was soll daran unlogisch sein? nur so rufst du bei der instanzierung gleich den konstruktor auf und kannst die ganzen tbirdschen fähigkeiten mit nullen belegen, hehe

Xmas
2002-11-03, 19:07:12
Nochmals OT (und EOD hier, bei weiterem Interesse Split ;)):
Schreibst du etwa auch
int i = new int(); ?
Deswegen unlogisch ;)

grakaman
2002-11-03, 19:14:33
@ xmas

du bekommst aber ne fehlermeldung, wenn du versuchst nen objekt ohne initialisierung auszugeben. bei normalen variablen macht mans wohl kaum, weil man da gleich n wert zuweist, aber bei instanzierten klassen ist das normalerweise üblich ;) oder hast du lust zb. 20 felder nach der instanzierung erst mal manuell zu initialisieren?

mfg

Xmas
2002-11-03, 19:28:27
Grakaman das ist mir schon klar, aber ich finde die Syntax übel.
Wieso sollte ich erst mit "int i" eine Variable/Objekt deklarieren und dann i ein neues initialisiertes Objekt zuweisen, statt direkt i zu initialisieren?

grakaman
2002-11-03, 19:31:52
xmas, bei variablen versteh ich dich, aber ich rede von instanzierten klassen. und da initialisiert man die felder üblicherweise mit nen konstruktor.

ps. du instanzierst nur ein objekt. die eine variante ist nur ohne und die andere mit konstruktor

Xmas
2002-11-03, 19:51:32
grakaman mir ist das mit dem Konstruktor schon klar, ich programmiere schon etwas länger C++. Aber wieso sollte man den Konstruktor nicht für das Objekt das man anlegt nutzen sondern erst für ein unbenanntes Objekt, das man dann dem benannten zuweist?

grakaman
2002-11-03, 20:03:02
xmas, ich beschäftige zwar mich momentan hauptsächlich mit c#, aber müsste genauso wie bei c++ sein. du instanzierst "nur ein" objekt. das kannst du sowohl mit "klassenname objektname;" oder "klassenname objektname = new klassenname();" machen. in beiden fällen wird "nur ein" objekt instanziert. der unterschied besteht nur darin, dass im ersten fall keine felder/eigenschaften initialisiert werden, weil kein konstruktor aufgerufen wird. in dem fall mit new rufst du aber bei der instanzierung den konstruktor auf und alle felder werden standardmäßig mit 0 bzw. false initialisiert, wenn du das nicht im standardkonstruktor festlegst oder überlädst den konstruktor. ausserdem müsstest du ja dann die felder als public deklarieren, wenn du keinen konstruktor aufrufen willst. das sollte man aber normalerweise nun überhaupt nicht machen ;)

mfg

Xmas
2002-11-03, 20:22:54
In C++ wird immer der Konstruktor aufgerufen (falls es einen gibt, wenn nicht wird wegoptimiert). Sprich:
MyClass c;
ruft den Standardkonstruktor auf. Der Operator new ist für dynamische Speicherverwaltung und gibt eine Adresse auf einen neu angelegten Speicherbereich zurück.

grakaman
2002-11-03, 20:35:08
das kann ich jetzt nicht ganz glauben. das würde ja heissen, dass folgendes in c++ geht:

int x;
cout << x;

meines wissens müsste das aber ne compilerfehlermeldung geben. hab auch noch mal in paar foren nachgesehen und die meinten da auch, dass new den konstruktor aufruft ???

mfg

Demirug
2002-11-03, 20:40:10
grakaman,

ja das geht, leider:(. x ist in diesem Fall aber irgendwas. bei C++ wird mit new der Konstruktor aufgerufen aber auch speicher auf dem Heap angefordert: Im gegensatz zu C# kann man bei C++ Objekte wahlweise auf dem Stack oder dem Heap anlegen.

grakaman
2002-11-04, 08:18:37
ja ok, aber objekte, auf die man global zugreifen will, legt man nun mal auf dem heap an. und klassen benutzt man nun mal idr global. ich versteh jetzt das problem hier nicht ganz.

mfg

Lokadamus
2002-11-04, 10:48:56
Originally posted by grakaman
das kann ich jetzt nicht ganz glauben. das würde ja heissen, dass folgendes in c++ geht:
int x;
cout << x;
meines wissens müsste das aber ne compilerfehlermeldung geben. hab auch noch mal in paar foren nachgesehen und die meinten da auch, dass new den konstruktor aufruft ???

mfg
mmm...

Dat geit ...

#include <iostream.h>

int main () {
int x;
cout << x;
return 0;
};

... getestet unter Visual Studio 6.0 ... Ergebniss, es wird eine Warnung herausgegeben, das X nicht initialisiert wird ... X hatte in diesem Fall den Wert -859893460 ... es wurde für X eben einfach nur ein Platz genommen, mehr nicht ...

grakaman
2002-11-04, 11:58:12
mmmhm, find ich trotzdem komisch :D

bsp:

int* p;
int x;

p = &x;

--> fehlermeldung, weil x noch keine adresse besitzt, da ihr noch kein wert zugewiesen wurde. würde ich zuvor x mit ner zahl initialisieren, würde das bsp. gehen. warum gehts das bsp oben nicht, aber einen nicht initialisierten, nicht vorhandenen wert, wo es auch keine adresse gibt, kann er scheinbar ohne prob ausgeben?

mfg

zeckensack
2002-11-04, 14:42:38
Originally posted by grakaman
mmmhm, find ich trotzdem komisch :D

bsp:

int* p;
int x;

p = &x;

--> fehlermeldung, weil x noch keine adresse besitzt, da ihr noch kein wert zugewiesen wurde. würde ich zuvor x mit ner zahl initialisieren, würde das bsp. gehen. warum gehts das bsp oben nicht, aber einen nicht initialisierten, nicht vorhandenen wert, wo es auch keine adresse gibt, kann er scheinbar ohne prob ausgeben?

mfg Geht in C++
Schmeißt zwar eine Compilerwarnung, aber geht. Ist doch vollokommen in Ordnung so.

i liegt auf dem Stack (p übrigens auch), ergo hat i zwar keinen gültigen Wert, sehr wohl aber eine gültige Addresse.

grakaman
2002-11-04, 15:05:13
so ne scheisse, da muss ich heute abend wohl mal ne bücherverbrennung machen...

Lokadamus
2002-11-04, 15:14:43
mmm...

@grakaman
Was für Bücher hast du den ??? oder welchen Compiler benutzt du ???

Hatte es bisher eigentlich immer so gelernt, das man immer einen Platz reservieren kann, ihn aber wegen dem unbekannten Wert einen eigenen Wert mitgeben soll, um dadurch Fehler zu vermeiden ... soweit ich es weiss, wird dabei eh nix anderes gemacht, ausser eine bestimmte Stelle im Speicher dafür genommen ... lässt man sich den Wert anzeigen, bekommt man das, was gerade drinne ist und das ist grundsätzlich nicht das, was man haben möchte ... neuere Compiler sollen solche nicht vorbelegten Variablen mit 0 füllen, weiss aber nicht, welcher Compiler das macht ...

Modulor
2002-11-06, 22:45:14
Mmhh - scheint ja der Hammerthread schlechthin zu sein mit einem thema das echt bewegt. Innerhalb von zwei Tagen 3580 hits - das ist wahrlich nicht schlecht ;)...
















Jaja, ich weiß...:D

Xmas
2002-11-07, 00:51:40
LOL