Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum
>
Entwickler
>
Objective-C vs. C++, ein Vergleich
Objective-C vs. C++, ein Vergleich
jerome155
23.04.13
21:20
Hallo zusammen
Ich habe nun eine Weile mit C++ verbracht und würde von mir selbst behaupten, die Sprache einigermassen zu beherschen. Ich stehe nun vor der Entscheidung, für ein Uniprojekt mit OpenGL entweder C++ oder Objective-C zu verwenden. Programmiert wird in XCode ein App für das iPad. Dabei wird uns ein Framework zur Verfügung gestellt, welches in C++ weitergeführt würde. Da ich dem Framework aufgrund Ausführungen der Teaching Assistants nicht unbedingt vertraue, haben wir nach einem Framework ähnlicher Art gesucht und auch gefunden, allerdings verlangt dieses Objective-C. Wie ich gehört habe, sind die Unterschiede nicht allzu gross, deshalb wollte ich Wissende fragen, wie denn genau die Unterschiede zwischen C++ und Obj-C sind?
Gegoogelt habe ich das ganze bereits, Resultate habe ich auch gefunden, jedoch waren diese zu wenig ausführlich... Darum bin ich um euer Wissen sehr froh.
Danke für eure Hilfe
Hilfreich?
0
Kommentare
JF Sebastian
23.04.13
21:48
Ähm, die Syntax und das Framework? Statt der Bibliothek arbeitest Du ja mit Obj. C mit Cocoa Touch und verbringst die meiste Zeit in der Doku dazu. Ansonsten liegt bei beiden ja C drunter, das man bei Obj. C öfter nutzt (oder kann). Das neue Automatic Reference Counting und die Nachrichten in Obj. C sind natürlich super cool.
Das war jetzt vielleicht nicht so hilfreich, aber ich weiss nicht worauf Du Wert legst.
Hilfreich?
0
jerome155
23.04.13
22:19
Das ganze bezog sich eher auf die Syntax. Danke für deine Einschätzungen! Das mit dem Message-System habe ich bereits gelesen, scheint wirklich eine tolle Sache zu sein!
Hilfreich?
0
Bitnacht
23.04.13
23:46
Objective C und C++ haben nicht ganz so viel gemeinsam, wie man denken möchte. C++11 ist eine sehr mächtige Sprache, mit der sich viele Dinge elegant ausdrücken lassen. Ältere ausgaben von C++ machen einiges umständlicher und schwerer lesbar, aber grob betrachtet fallen die Unterschiede oft nicht einmal auf.
Objective C ist eine überschaubarere Sprache. Die reine Syntax ist schnell erklärt (wenn man C schon kann) aber die Nutzung in den Frameworks ist sehr clever und hat viele Konventionen, die man richtig anwenden muss. Ausserdem hat Cocoa die Tendenz zu leicht umständlichen Methodennamen [foo initWithCoder: bar byAlgorithm: sort forClient: self].
Umgekehrt gibt es einige Programmierregeln in C++ die in Objektive C keinen Sinn machen würden, weil Obj C viel dynamischer ist und weniger stark auf Compiler-Time-Features zurückgreift.
Das Command-Pattern und "Ressource aquisition is initialization" sind einige Beispiele für Konzepte, die in Objektive C keinen Vorteil bringen.
Gestandene C++-Programmierer haben oft Probleme sich umzugewöhnen. Beispielsweise ist die Idee, dass Methodenaufrufe einfach verpuffen können ist einigen unheimlich (sending messages to NIL, etc...).
Cocoa Programmierer finden C++ tendenziell umständlich, inkonsequent und voller Features mit zweifelhaftem Mehrwert. Es dauert länger eine korrekte C++-Klasse zu implementieren als ihr ObjC Gegenstück. Dafür kann man ggF. einiges an RAM und Taktzyklen mit C++ sparen, die als overhead von der Cocoa Runtime immer dabei sind.
Hilfreich?
0
JF Sebastian
23.04.13
23:49
Meine C++ Kenntnisse reichen leider für einen direkten Vergleich nicht aus. Von der Java Seite her würde ich aber noch die @property im Header File mit @synthesize in der Implementation hervorheben, damit erspart man sich das implemtieren der Getter/Setter. Wichtig ist auch das Obj. C einem dazu zwingt Design Patterns zu nutzen, wo man sich mit C++ drumrummogeln kann. Weiter mag ich mich aber nicht aus dem Fenster lehnen.
Wahrscheinlich wird man aber sowie in einem Apple Forum eh nur Werbung für Obj. C erhalten
Hilfreich?
0
JF Sebastian
23.04.13
23:52
@Bitnacht: Message to nil? Ohhhh ja, das ist freakig. Hat mich einiges an Lebenszeit gekostet
Hilfreich?
0
ExMacRabbitPro
23.04.13
23:57
Wenn Du auf dem Gerät eine GUI erzeugen willst - was Du eigentlich musst (auf dem iPad gibt es ja keine Konsolen-Apps
), dann kommst Du um ObjC und Cocoa doch gar nicht herum. Denn alle für die Benutzung von iOS nötigen APIs Verlagen ObjC.
Das ist aber auch gar nicht schlimm, Du kannst ja problemlos in einem Projekt ObjC mit C++ mischen.
Sodass die Cocoa GUI mit ObjC gemacht ist und die App dann dein Framework in C++ aufruft.
Und bezüglich der Syntax sieht es ungefähr so aus:
Nehmen wir mal an, Du hast eine Klasse Rechner die im Konstruktor zwei Werte (a und b) erhält und die summe davon berechnen kann. Jeweils in C++ und ObjC. Dann sieht die Benutzung der Klasse so aus in C++:
int a = 5;
int b = 3;
Rechner * r1 = new Rechner(a, b);
int result = r1->summe();
std::cout << "result " << result << "\n";
delete r1;
... und in ObjC;
int a = 5;
int b = 3;
Rechner * r1 = [[Rechner alloc] initWithA:a andB:b];
int result = [r1 summe];
NSLog(@"result %i\n", result);
[r1 release];
Nun hast Du ungefähr einen Eindruck, was Dir "blüht"... aber keine Angst, die ObjC Syntax ist intuitiver als sie aussieht und nach 2 Wochen denkst Du nicht mehr darüber nach.
Hilfreich?
0
Bitnacht
24.04.13
07:57
JF Sebastian
@Bitnacht: Message to nil? Ohhhh ja, das ist freakig. Hat mich einiges an Lebenszeit gekostet
Stichwort "freakig": Es gibt in C++ etwas was mich einiges an Haaren gekostet hat: wenn man einen Konstruktor mit genau einem Parameter hat und nicht "explicit" davor schreibt, dann wird dieser automatisch und "unsichtbar" aufgerufen, um in einem (anderen) Funktionsaufruf eine Typkonversion vorzunehmen:
Klasse a - Konstruktor nimmt Parameter Klasse b
Funktion nimmt Parameter Klasse a.
Aufruf der Funktion (versehentlich) mit Parameter vom Typ b.
Ein neues Objekt der Klasse a wird mit dem Konstruktor auf dem Stack erzeugt und nach Aufruf der Funktion gelöscht.
Als Folge hab ich zwei Jahre lang "explicit" für das wichtigste Schlüsselwort in C++ gehalten. Danach hatte ich mich beruhigt
Hilfreich?
0
Navier-Stokes
24.04.13
21:08
Ja, das ist in C++ schon manchmal haarig: man muss schon ziemlich genau wissen, was eine Kasse alles zur Verfügung stellt, um die tatsächlichen impliziten Aufrufe zu kennen.
Ist das in Obj-C anders?
„Computer Science is no more about computers than astronomy is about telescopes. (Edsger W. Dijkstra)“
Hilfreich?
0
gfhfkgfhfk
26.04.13
07:39
ExMacRabbitPro
Nehmen wir mal an, Du hast eine Klasse Rechner die im Konstruktor zwei Werte (a und b) erhält und die summe davon berechnen kann.
Nein, in C++ würde man das eben nicht so machen.
Hilfreich?
0
ExMacRabbitPro
26.04.13
08:08
gfhfkgfhfk
ExMacRabbitPro
Nehmen wir mal an, Du hast eine Klasse Rechner die im Konstruktor zwei Werte (a und b) erhält und die summe davon berechnen kann.
Nein, in C++ würde man das eben nicht so machen.
Hallo? Das war ein simpel Beispiel ohne Anspruch auf Sinnvolligkeit. Es ging mir darum ein Beispiel für die Sytaxunterschiede zwischen C++ und ObjC irgendwie darzustellen.
Hilfreich?
0
Bitnacht
26.04.13
08:46
Navier-Stokes
Ist das in Obj-C anders?
Ja. Natürlich gibt es durch Vererbung , das Delegate-Konzept und Protokolle Situationen, wo ein Aufruf nach weniger aussieht, als er ist, aber das ist etwas anderes.
Objective C unterstützt auch nicht das Überladen von Funktionen anhand der Parametertypen. Deswegen heißen dann Methoden "initWithInteger" und "initWithString". Das ist zwar mehr Schreibarbeit, aber der generischen Programmierung schadet es kaum. Man behält so aber umgekehrt auch ganz gut den Überblick.
Hilfreich?
0
gfhfkgfhfk
26.04.13
09:11
ExMacRabbitPro
Hallo? Das war ein simpel Beispiel ohne Anspruch auf Sinnvolligkeit. Es ging mir darum ein Beispiel für die Sytaxunterschiede zwischen C++ und ObjC irgendwie darzustellen.
Nur so würde man dieses Codebeispiel in C++ nie formulieren. Entweder so
Rechner r1(3, 5);
std::cout << r1.summe() << std::endl;
oder so
boost::shared_ptr<Rechner> r1(new Rechner(3, 5));
std::cout << r1->summe() << std::endl;
Die ISO Variante mit shared_ptr spare ich gerade mal aus, dazu müßte ich erstmal die ISO Norm anschauen.
Hilfreich?
0
twilight
26.04.13
10:16
@gfhfkgfhfk & ExMacRabbitPro:
Schönes simple Beispiele für ObjC und C++
Irgendwie bestätigt das mein Vorurteil, dass C++ irgendwie "komisch riecht" und der Code nicht sehr angenehm lesbar ist
Davon ab würde ich das Beispiel so schreiben:
int a = 5;
int b = 3;
Rechner * r1 = [[[Rechner alloc] init] autorelease];
int result = [r1 summeAus:a mit:b];
NSLog(@"result %i\n", result);
Und da kommen die Nettigkeiten von ObjC hervor:
int result = [r1 summeAus:a mit:b];
Der Methodennamen
[r1 summeAus: mit:]:
spricht für sich selbst.
Peter
„Auch dienstlich tu ich mir garantiert kein Windows an!“
Hilfreich?
0
ExMacRabbitPro
26.04.13
10:42
Es ist so eine Foren-Unart, dass gewisse Leute gerne die Energie aufwenden die Antworten anderer Leute zu kritisieren aber dagegen seltenst aus freien Stücken direkt etwas zum Thema beitragen...
Amen!
Hilfreich?
0
twilight
26.04.13
10:53
ExMacRabbitPro
Es ist so eine Foren-Unart, dass gewisse Leute gerne die Energie aufwenden die Antworten anderer Leute zu kritisieren aber dagegen seltenst aus freien Stücken direkt etwas zum Thema beitragen...
Amen!
Sollte ich mich angesprochen fühlen
Peter
„Auch dienstlich tu ich mir garantiert kein Windows an!“
Hilfreich?
0
ExMacRabbitPro
26.04.13
11:15
twilight
ExMacRabbitPro
Es ist so eine Foren-Unart, dass gewisse Leute gerne die Energie aufwenden die Antworten anderer Leute zu kritisieren aber dagegen seltenst aus freien Stücken direkt etwas zum Thema beitragen...
Amen!
Sollte ich mich angesprochen fühlen
Peter
Nein
Hilfreich?
0
jerome155
26.04.13
12:22
Danke für die vielen konstruktiven Antworten
. Mir ist bewusst das ich sehr wohl Obj-C mit C++ vermischen muss, aber es ist auch möglich ein GUI ohne Obj-C zu schreiben (Mit OpenGL und Texture-Mapping kann man da sehr viel machen). Da es ein 3D-Game wird bietet sich diese Variante so oder so an.
Einziges Problem dabei ist, dass das App sobald gestartet sämtliche Objekte zuerst laden muss, was beim iPad ein leerbleibender, schwarzer Bildschirm bedeutet
.
Hilfreich?
0
ExMacRabbitPro
26.04.13
12:36
jerome155
Danke für die vielen konstruktiven Antworten
. Mir ist bewusst das ich sehr wohl Obj-C mit C++ vermischen muss, aber es ist auch möglich ein GUI ohne Obj-C zu schreiben (Mit OpenGL und Texture-Mapping kann man da sehr viel machen). Da es ein 3D-Game wird bietet sich diese Variante so oder so an.
Einziges Problem dabei ist, dass das App sobald gestartet sämtliche Objekte zuerst laden muss, was beim iPad ein leerbleibender, schwarzer Bildschirm bedeutet
.
Natürlich kannst Du mit OpenGL deine gesamte GUI selbst machen. Das tun auch alle Game Engines. Einzig ein minimales Grundgerüst der App in ObjC und Cocoa benötigst Du, um einen OpenGL View zu etablieren. Von da an ist es dann dir überlassen was du machst.
Was den Ladevorgang angeht, so ist es natürlich kein gutes Application-Design einen schwarzen Bildschirm zu zeigen und erst alle Objekte zu laden. Unter iOS muss eine App auch innerhalb von 2 Sekunden (oder waren es 5? weiss nicht mehr) einen initialen View dem User angezeigt haben, sonst wird die App vom System beendet.
Aber es ist normalerweise kein Problem, diesen View als Ladefortschrittsanzeige zu realisieren und im Hintergrund alle notwendigen Dinge zu laden. So sieht der User auch, dass sich etwas tut.
Hilfreich?
0
jerome155
26.04.13
14:30
ExMacRabbitPro
Aber es ist normalerweise kein Problem, diesen View als Ladefortschrittsanzeige zu realisieren und im Hintergrund alle notwendigen Dinge zu laden. So sieht der User auch, dass sich etwas tut.
Klar, so wird das auch geschehen
. Ich werde wahrscheinlich bei C++ bleiben und mir die nötigen Elemente für Obj-C heraussuchen.
Hilfreich?
0
gfhfkgfhfk
26.04.13
18:59
Auch wenn etwas gut gemeint ist, ist es nicht automatisch gut. Wenn man also Programmbeispiele bringt, sollte dieses nicht aus der Mottenkiste heraus geholt werden. Wenn man die Unterschiede zwischen zwei Programmiersprache aufzeigen will, dann sollte man in der Lage sein die unterschiedlichen Konzepte wiedergeben zu können. Wenn man in einem Programmbeispiel für C++ RAII nicht verwendet - wird es nun einmal peinlich. Dazu ist dieses Konzept viel zu lange im Umfeld etabliert und akzeptiert.
ExMacRabbitPro
Es ist so eine Foren-Unart, dass gewisse Leute gerne die Energie aufwenden die Antworten anderer Leute zu kritisieren aber dagegen seltenst aus freien Stücken direkt etwas zum Thema beitragen...
Es ist einen Forenunart, daß auf Kritik Personen immer wieder mit persönlichen Angriffen reagieren.
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.
20 Jahre Mac mini
Neuer Mac: Vorbereitung für den Umzug vom alten...
Apple verbessert Bildschirm-Unterstützung beim ...
Mac-Wartung: Alte Kernel-Erweiterungen entfernen
Mac OS X: 25 Jahre Aqua, 25 Jahre Dock
Apple gewährt Einblick in Audio- und Video-Test...
iPad Pro M4: Hinweise auf geringere Nachfrage
iPad Pro M4 wird grün – Displayfehler bei immer...