PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Einfache Frage: Objekt vorhanden?


WhiteVelvet
2006-07-24, 15:39:15
Ich erstelle ja ein neues Objekt mit

myClass myObject = new myClass();

Ich will das Objekt später wieder zerstören, aber vorher muss ich dann wissen, ob myObject überhaupt instanziiert wurde, also ob das Objekt überhaupt existiert, das ich zerstören will. Wie frage ich das ab?

Coda
2006-07-24, 15:44:24
new wirft ne std::bad_alloc Exception wenn es nicht funktioniert hat - ansonsten ist das Ding instanziert.

WhiteVelvet
2006-07-24, 15:50:26
Nicht "new" soll meckern, sondern ~myClass, also der Destruktor. Über Exceptions will ich eigentlich nicht erst gehen müssen.

del_4901
2006-07-24, 15:57:14
WhiteVelvet[/POST]']Nicht "new" soll meckern, sondern ~myClass, also der Destruktor. Über Exceptions will ich eigentlich nicht erst gehen müssen.
Nullzeiger kann man immer löschen ohne das was passiert. Sorg also dafür das er Null wird wenn new nicht geklappt hat.

Gnafoo
2006-07-24, 15:58:33
Wie Coda bereits sagte. Dafür ist die Exception da (warum willst du die vermeiden btw?). Wenn new funktioniert hat, kannst du davon ausgehen, dass der Pointer zugewiesen wurde und du das Objekt löschen kannst. Wenn die Möglichkeit besteht, dass du das Objekt mehrfach löschen solltest, kannst du auch den Pointer nach dem Löschen auf 0 setzen, dann bleibt zukünftiges Löschen ohne Auswirkungen.
Der Destruktor wird nur aufgerufen, wenn das Objekt existiert und dann gelöscht wird. Der kann also gar nicht „merken“, dass das Objekt nicht instanziiert wurde, weil er ohne Objekt nicht aufgerufen werden kann O_o. Ich bin mir nicht ganz sicher, was du damit meinst.

WhiteVelvet
2006-07-24, 16:06:14
OK, etwas Hintergrund: Ich habe ein TabControl in meiner Anwendung, 2 Tabs haben jeweils ein OpenGL Objekt, in das gezeichnet wird. Da ich aber immer nur ein OpenGL Objekt haben kann, muss ich beim Verlassen des einen Tabs immer das OpenGL-Objekt killen, damit das andere Tab es wieder neu erstellen kann. Das hab ich in meiner Hauptklasse:

if (m_tabctrlMain.GetCurSel()==1)
{
((tabDialog2*)m_tabctrlMain.GetTab(2))->DestroyOpenGL();
((tabDialog2*)m_tabctrlMain.GetTab(1))->CreateOpenGL();
((tabDialog2*)m_tabctrlMain.GetTab(1))->ActivateRenderTimer();
}

if (m_tabctrlMain.GetCurSel()==2)
{
((tabDialog2*)m_tabctrlMain.GetTab(1))->DestroyOpenGL();
((tabDialog3*)m_tabctrlMain.GetTab(2))->CreateOpenGL();
((tabDialog3*)m_tabctrlMain.GetTab(2))->ActivateRenderTimer();
}

Das Problem ist der erste Start, da kann er nämlich nichts zerstören. Ich kann dies natürlich umgehen und beim Start einfach ein Objekt ins Blaue (also einfach ins Tab2) erstellen, aber das wäre unschön ;) Oder eine Statusvariable, aber dafür extra eine Variable erstellen hmmm... ich hab schon so viele, wird nur unübersichtlich.

Coda
2006-07-24, 16:17:39
WhiteVelvet[/POST]']Da ich aber immer nur ein OpenGL Objekt haben kann
Das stimmt doch gar nicht.

WhiteVelvet[/POST]']Das Problem ist der erste Start, da kann er nämlich nichts zerstören.
Dann initialisier die Pointer mit 0 - wie schon oft gesagt.

Gast
2006-07-24, 16:18:51
WhiteVelvet[/POST]']Nicht "new" soll meckern, sondern ~myClass, also der Destruktor. Über Exceptions will ich eigentlich nicht erst gehen müssen.Ein Destruktor ist auch nur eine Methode einer Klasse. Er existiert nur, wenn auch ein Objekt dieser Klasse existiert. Also ist es sinnlos, über den Destruktor einer Klasse zu prüfen, ob ein Objekt existiert, denn wenn der Destruktor existiert, gibt es natürlich auch das zugehörige Objekt.

Warum wehrst du dich so gegen Exeptions? Das ist die Standardvorgehensweise in diesem Fall.

Warum kannst du eigentlich nur ein OpenGL-Objekt erstellen?

WhiteVelvet
2006-07-24, 16:25:24
Ich habs nun doch über eine Statusvariable gemacht, geht jetzt schneller ;) Mir wurde gesagt, dass OpenGL eine Statusmaschine sei und dass es daher nur eine Kopie jeder Matrix gäbe. Ich beziehe mich auf diesen Thread hier:

http://www.c-plusplus.de/forum/viewtopic-var-t-is-152808-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html

Ich selbst habe keine 2 Fenster gleichzeitig erzeugen können. Es ging immer nur eines, das andere zeigte Speicherwirrwarr in Form von horizontalen "Teststreifen" ;) Jetzt habe ich ja 2, das reicht erstmal.

Coda
2006-07-24, 16:28:54
WhiteVelvet[/POST]']Ich habs nun doch über eine Statusvariable gemacht, geht jetzt schneller
WOZU? Omg... Man wird doch wohl kapieren können dass delete(0); nichts macht.

Coda
2006-07-24, 16:29:43
WhiteVelvet[/POST]']Mir wurde gesagt, dass OpenGL eine Statusmaschine sei und dass es daher nur eine Kopie jeder Matrix gäbe. Ich beziehe mich auf diesen Thread hier:
Ja die labern Müll. Du kannst ohne weiteres 2 OpenGL-Kontexte benützen. Kannst sogar die Resourcen sharen.

WhiteVelvet
2006-07-24, 16:37:30
Coda[/POST]']WOZU? Omg... Man wird doch wohl kapieren können dass delete(0); nichts macht.

Warum so gereizt? Und wieso "delete(0)"?

Es klappt aber im Moment doch nicht so einfach. Der Wechsel von Tab2 - Tab3 - Tab2 - Tab3 endet in einer Exception. Das ständige Erzeugen und Killen mag er wohl doch nicht.

Coda
2006-07-24, 17:35:18
Initialisier die Pointer mit 0 und setzt sie nach dem delete auf 0. Fertig.