Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 23:13

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Objekte[n] von einer Klasse erstellen

Discussion on Objekte[n] von einer Klasse erstellen within the C/C++ forum part of the Coders Den category.

Reply
 
Old 08/23/2012, 21:59   #31


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by Nightblizard View Post
Und andere raten immer und überall von goto ab. Doch auch das hat seine Anwendungsbereiche. (mal schauen ob ich jetzt gesteinigt werde)
Zieht die Scheuklappen aus, das macht das Leben sehr viel leichter.
goto ist aber einfach obsolet in C++, es gibt keinen Verwendungszweck mehr, der nicht anders oder sogar besser gelöst werden könnte.

Und nun komm mir nicht mit dem Linux Kernel, das ist C.
MrSm!th is offline  
Old 08/23/2012, 22:24   #32
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Quote:
Originally Posted by MrSm!th View Post
goto ist aber einfach obsolet in C++, es gibt keinen Verwendungszweck mehr, der nicht anders oder sogar besser gelöst werden könnte.

Und nun komm mir nicht mit dem Linux Kernel, das ist C.


Code:
int foo()
{
     auto someRessource = RessourceMgr::loadRessource("foo.bar");
     auto anotherRessource = RessourceMgr::loadRessource("bar.bar");
     std::ofstream someFile("someFile.txt");
     std::vector<byte> someBuffer;

     int error = doSomething(someRessource, someBuffer);
     if(error != ERROR_SUCCESS)
     {
          someRessource->release();
          anotherRessource->release();
          return error;
     }

     error = doSomething(anotherRessource, someBuffer);
     if(error != ERROR_SUCCESS)
     {
          someRessource->release();
          anotherRessource->release();
          return error;
     }

     error = doMore(someFile, someBuffer);
     if(error != ERROR_SUCCESS)
     {
          someRessource->release();
          anotherRessource->release();
          return error;
     }


     someRessource->release();
     anotherRessource->release();
}

int bar()
{
     auto someRessource = RessourceMgr::loadRessource("foo.bar");
     auto anotherRessource = RessourceMgr::loadRessource("bar.bar");
     std::ofstream someFile("someFile.txt");
     std::vector<byte> someBuffer;

     int error = doSomething(someRessource, someBuffer);
     if(error != ERROR_SUCCESS)
          goto cleanup;

     error = doSomething(anotherRessource, someBuffer);
     if(error != ERROR_SUCCESS)
          goto cleanup;

     error = doMore(someFile, someBuffer);
     if(error != ERROR_SUCCESS)
          goto cleanup;

cleanup:
     someRessource->release();
     anotherRessource->release();
}
Sag mir welches du schöner findest.

Ein weiteres Beispiel, welches sich nur schwer und eher unschön anders lösen lässt:
Code:
void meow(int foo, int bar)
{
     for(int i = 0; i < foo; ++i)
     {
          for(int j = 0; i < bar; ++j)
          {
               if(foobar(foo, bar) == false)
                    goto stop;
          }
     }
stop:
}
Ich denke das sollte reichen.
Nightblizard is offline  
Old 08/23/2012, 23:57   #33


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Und genau das erste ist ein Negativbeispiel.

Cleanup gehört in den Destruktor und dann arbeitest du einfach nicht mit Return Werten, sondern mit Exceptions.
Dann wird das Cleanup direkt beim Stack Unwinding übernommen.
Diese ganze if(error) Struktur macht den Code unübersichtlich und schwerer zu verstehen.

Das zweite ist ebenso ein Design-Fehler, man sollte möglichst wenig Sprünge in seinem Code haben. Ein break wäre da genau so unschön btw.
Das wäre entweder auch ein Fall für Exceptions oder ggf. ne extra Schleifenbedingung.

Klar, man sollte solche Sachen nicht vollständig verdammen und für alle "Schlechter-Stil-Beispiele" gibt es immer Ausnahmen, sonst wär es gar nicht in der Sprache geblieben (wobei goto eher aus Kompatibilitätsgründen drin ist), aber goto ist defintiv obsolet und lässt sich in so gut wie jedem Fall umgehen. Die wenigen anderen Fälle könnte man evtl einfach umdesignen und dann bleibt nur noch ein Minimalteil, wo ein goto wirklich Sinn macht.
(Bei unions sieht das natürlich anders aus, bei Netzwerk Interaktion kann das zugegebenermaßen ganz praktisch sein, WOBEI: eigentlich bietet C++ für Bitmasks eigene Container. Die allermeisten union Beispiele, die ich kenne, sind C Beispiele, die im Grunde native C++ Mechanismen immitieren (und dein goto Beispiel immitiert zb. eine Art Destruktor/finally Block Mischmasch). union und goto sind beide eher so C Relikte, die man größtenteils in C++ durch zumindest gleichwertiges ersetzen kann. union akzeptiere ich da aber noch eher als goto )

Ich würde aber sagen, wenn es da noch was zu diskutieren gibt, sollten wir das lieber per PM oder per Profilnachricht tun (oder nen eigenen Thread aufmachen), da das hier nicht mehr so wirklich hingehört.
MrSm!th is offline  
Reply


Similar Threads Similar Threads
[HowTo]Objekte, Waffen und Rüssis für Metin2 mit 3DS MAX 7 erstellen
01/18/2015 - Metin2 PServer Guides & Strategies - 98 Replies
GR2 To Mesh Wird hier erklärt Klick mich In dieser Anleitung werde ich erklären wie man ein eigenes Schwert in 3D Studio MAX modelliert, texturiert (mit vorgefertigter Textur), exportiert und für Metin2 nutzbar macht. Also der ganze Ablauf um komplett neue eigene Waffen oder auch andere Objekte für Metin2 zu erstellen. Dabei verwende ich 3ds max 7 Trial, welches für zunächst 30 Tage kostenlos zu nutzen ist, vielleicht funtkioniert das meiste auch mit gmax (kostenlos) mit ein paar...
C++ / Array in einer Klasse
06/21/2012 - C/C++ - 9 Replies
Hi Leute! Ich erstelle das Objekt "ElevatorControl" genau einmal. Zu einem späteren Zeitpunkt erstelle ich ein oder mehrere Objekte von "ElevatorCabin" und möchte die Adressen von "ElevatorCabin" in dem Array "elevators","elevators", usw. speichern. Leider habe ich eine totale Denkblockade und komme einfach nicht drauf wie ich dass hinbekommen soll. Ich hoffe jemand von euch kann mir helfen. //ElevatorControl.h class ElevatorControl { public: void requestUpward(int atLevel); void...
[C++] Vraiblen einer KLasse in die Funktion einer anderen einfügen
03/14/2011 - C/C++ - 10 Replies
Hallo Leute, Ich habe mal wieder eine Frage :D Ich bin gerade dabei ein kleines Spiel(noch ist es klein ;D) zu programmieren. Dabei bin ich auf das Problem gestoßen, dass ich gerne die Verteidigung der "User" Class in eine Berechnung(Funktion) einer "Npc" Class einbinden würde. Dies funktioniert aber weder durch: -Einführen einer Funktion in der User class die eine Variable returned die den selben Wert besitzt, wie die Variable der Verteidigung in der Userclass -Direktes Aufrufen der...
[Frage]3D-Objekte erstellen
12/05/2010 - Minecraft - 4 Replies
Hey Leute, Ich wollte mal fragen mit welchen Programm man beispielsweise das 3D Objekt der Schaufel umwandeln kann :)..! bzw. genauer erklärt haben wie Minecraft umgewandelte Texturen annimmt weil ich mir ne versäcuhte Welt aufbauen wollte(dunkel grünes Wassser etc.) mfg Mine
[C++]Funktion einer Klasse in einer anderen Funktion der Klasse verwenden, aber wie?
07/25/2010 - C/C++ - 3 Replies
Mein Problem ist eigentlich recht simpel und die Lösung wahrscheinlich auch. Da ich bisher fast 0 mit Klassen am Hut hatte, wollte ich mich doch mit dem Thema anfreunden und hatte gleich angefangen: int test::Funktion2() { int temp; cin>>temp; return temp; }



All times are GMT +1. The time now is 23:13.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.