C++ / Delphi
-
So. Jetzt muss ich mich hier auch mal einmischen. Scheinbar bist du dir nicht ganz im Klaren, was du da schreibst, Th3Law. Das meiste ist Humbuk.
var
I: Integer;
begin
I := 5;
for I := 0 to I do
begin
// Do Something;
end;
end;Was ist das denn?! Wenn da I von 0 bis 5 iteriert wird, dann ist das mehr als unlogisch. Da ziehe ich doch
int i; for(i = 0; i<=5; ++i) // Do Something
doch um einiges vor. Und das Ergebnis ist das gleiche. Kommentare werden in Pascal übrigens per {} gemacht!
[quote=Luckie]
Und ich weiß, dass Arrays Pointer sindArrays ist ein Felder von Variablen...
[/quote]
Guter deutsch. Egal. Du hast recht und Luckie hat recht. Aber was ist denn ein Feld? Wie sieht denn sowas im Speicher aus? Kannst du mir das verraten? Wahrscheinlich nicht, denn wenn du das wüsstest, dann wüsstest du auch, dass ein Array nichts anderes als ein Pointer ist. Auch in Pascal![quote=C++arsten]Eine Frage: Kennt Delphi Container, wie etwa den <vector>? Wenn nein, wie wird dort dynamisch Speicher alloziert? Mit new?
Natürlich kennt Delphi Container wie z.b. TList, TObjectList, TStringList.
[/quote]
Das sind nichts anderes als Listen. Schonmal was von Templates gehört?[quote=Taurin]Diese dyn. Arrays verfügen aber nicht über die breite Auswahl an
Hilfsfunktionen wie ein std::vector (Einfügen und Löschen von Elementen,
Iteratorn).Dazu fällt mir nur ein: Keine Ahnung haben und trotzdem mitreden wollen.
[/quote]
Gleichfalls! Wobei das auch auf Taurin zutrifft, denn TList verfügt schon über solche Methoden (Add, Delete, ...).[quote=frager]ein riesen prob ist es -> also bei pascal ist das so bei delphi sicherlich! auch
if a=1 then b:=2; c:=4; <- geht nich...
nur so:if a=1 then begin b:=2; c:=4; end; <-*igitt*
Dir ist schon der Unterschied zwischen einer Anweisung und einem Anweisungsblock bekannt?
[/quote]
Ja, genau darum ging es <frager>!
-
Ich bin sogar der Ansicht, dass ein begin und end deutlicher sein kann als die geliebten Klammern, von denen hier gesprochen wird.
for (int i=0; i<5; i++) { //tu was }
ist doch nicht unbedingt übersichtlicher als (tun wir mal so, als gäb es das)
for (int i=0; i<5; i++) begin //tu was end
Da begin und end bei Delphi etwa fett gedruckt sind, wird die Syntax sogar noch hervorgehoben.
-
Desweiteren finde ich es übersichtlicher, wenn die Variablendeklarationen nicht in der ganzen Funktion verstreut sind, aber das ist ansichts Sache.
ich finde es sehr übersichtlich, wenn ich nicht ständig an den Anfang einer Funktion scrollen musss um zu wissen was für Variablen das sind (kommt mir jetzt nicht mit ungarischer Notation! Da Scroll ich lieber als mir so etwas an zu tun!), vorallem ist es performanter, wenn man nicht 1000 Objekte konstruiert, die man gar nicht braucht im Nachhinein.
Ein fettes begin und end sehe ich aber besser, als so eine mickrige geschweifte Klammer.
Wofür kann man seine Programme einrücken? (BTW. stört mich das die Delphi/Kylix IDE das nicht automatisch macht, ich hab keine Lust die hälfte meiner Arbeit damit zu verbringen die Aufgabe zu erledigen, die eigentlich meine IDE/Editor machen sollte
Dann mach doch welche. Es hindert dich keiner dran. :p
Wenn man pech hat, muss man mal den Code von anderen Leuten lesen und wenn man noch mehr pech hat, wurden die irgend wie dran gehindert diese Klammern zu machen
Was mathematisch auch korrekt ist. Oder könntest du das so stehen lassen:
i = i+1
Das ist schlicht und ergreifent mathematisch falsch, da kannst du mir erzählen was du willst. Desweiteren, wenn man ":=" für eine Zuwseiung nimmt hat man "=" frei für den Vergleich und so wird es auch in der Mathematik verwendet.
Mathematisch wär auch das korrekter 1 : 2 aber da bin ich bei noch einem Punkt der mich an (O)Pascal stört, die Operatoren sind teilweise unterschiedlich, Fließkommazahlen dividier ich mit / und Integers mit div und Mod gibt es nicht für Reals dafür wandelt man mit StrToFloat von String nach Real die Zahlen um (noch mehr )
Was spricht da gegen? confused Im wirklichen Leben entsteht auch nichts aus dem nichts. Bevor ich mit dem Bleistift schreiben kann, muß der auch erstmal hergestellt / erschaffen werden.
ich lass mir die Bleistifte immer Herstellen Aber mal im Ernst, angenommen du verlässt den Scope eines Objektes und du musst immer drauf achten den Destruktor explizit aufzurufen und angenommen du weisst nicht genau ob ein Objekt initalisiert wurde (Weil der Bezeichner existiert ja immer, dank der voraus deklaration).
-
Original erstellt von Th3Law:
**
[quote=C++arsten]Eine Frage: Kennt Delphi Container, wie etwa den <vector>? Wenn nein, wie wird dort dynamisch Speicher alloziert? Mit new?****
Natürlich kennt Delphi Container wie z.b. TList, TObjectList, TStringList.
Dynamischer Speicher reserviert man in ObjectPascal (oder neu: Delphi - Language) mit Dynamischen Arrays (bereits erwähnt), GetMem oder mit New:
var P: Pointer; IntPtr: ^Integer; begin GetMem(P, 20); // Reserveriert 20 Bytes; New(IntPtr); // Reserviert eine IntegerVariable 4 Bytes Dispose(IntPtr); // Gibt InegerVariable Frei; FreeMem(P); // Gibt dynamischen SpeicherBlock frei // Bei dynamischen Arrays muss keine Freigabe erfolgen, da ein Interner // Reference Counter mitgeführt wird
[quote=Taurin]Diese dyn. Arrays verfügen aber nicht über die breite Auswahl an
Hilfsfunktionen wie ein std::vector (Einfügen und Löschen von Elementen,
Iteratorn).[/quote]Dazu fällt mir nur ein: Keine Ahnung haben und trotzdem mitreden wollen.
**[/QUOTE]Und wie willst du in eine TList Integer speichern? Oder Reals? Oder Chars?
Geht nicht. Dafür brauchst du plötzlich dyn. Arrays, die besagte Operationen
nicht direkt unterstützen. Du kannst natürlich Pointer auf Integer in der TList
unterbringen, dann hast du aber wieder ein Stück Speicherverwaltung mehr am
Hals.Dynamische Arrays sind Pointer. Schaut euch noch mal das Beispiel von mir
ganz oben im Threat an.Th3Law, hättest du das gelesen und dir die Mühe gamacht, dies zu verstehen,
wär dir das wohl aufgefallen.
Ausserdem würde dir ein etwas höflicherer Ton auch nicht schaden.Zum Thema Variablendeklaration:
Die Bequemlichkeit mag hier eine Rolle spielen. In Delphi hab ich alle
Deklarationen auf einem Haufen und kann sie mir auf einmal anschauen,
dafür kommt ein Stück Scrollarbeit auf mich zu.
Das ist aber zweitrangig. In C++ wird der Speicher für Variablen erst dann
reserviert, wenn sie gebraucht werden. Nämlich in dem Block, in dem sie
deklariert werden. In Delphi muss zwangsweise bei einem Procedure-Aufrufe
der Speicher für alle Variablen der Procedure belegt werden, auch wenn einige
davon nicht gebraucht werden.[ Dieser Beitrag wurde am 06.01.2003 um 13:02 Uhr von Taurin editiert. ]
-
Hallo,
Was ist das denn?! Wenn da I von 0 bis 5 iteriert wird, dann ist das mehr als unlogisch
Nein es ist vollkommen logisch. Jeder der auch nur das geringste Ahnung von Informatik hat wird mir hier zustimmen.
Allerdings würde ich folgende Variante vorziehen
for I := 0 to 5 do begin // ... end;
Kommentare werden in Pascal übrigens per {} gemacht!
Für die, die es noch nicht mitbekommen haben: Wir führen hier keine C / Pascal weder noch eine C++ / Pascal sondern eine C++ / ObjectPascal Diskussion.
Ich frage mich, wie jemand, der nur sehr geringfügige Sprachkenntnisse hat einem, der offensichtlich um einiges mehr an Sprachkenntniss besitzt darauf hinzuweisen, obwohl er nicht die geringste Ahnung davon hat, dass es ein Sprachkonstrukt, was in jedem Quelltext vorkommt, in einer Sprache nicht exisitert, die überhaupt nicht zur Diskussion steht.
Aber was ist denn ein Feld?
Ein Speicherblock bestimmter Größe.
Wie sieht denn sowas im Speicher aus?
Es ist eine kompakte zusammenhängende Datenstruktur (im Gegensatz zu Bäumen oder verketteten Listen)
Das sind nichts anderes als Listen.
std::vector ist doch auch nicht sehr viel anderes als eine Liste.
Schonmal was von Templates gehört?
Ja.
ich finde es sehr übersichtlich, wenn ich nicht ständig an den Anfang einer Funktion scrollen musss um zu wissen was für Variablen
Darüber kann man sich streiten, ich denke beides ist nur reine Gewohnheitssache.
vorallem ist es performanter, wenn man nicht 1000 Objekte konstruiert, die man gar nicht braucht im Nachhinein
Objekte werden in Delphi, eh dynamisch erstellt.
Und wie willst du in eine TList Integer speichern? Oder Reals? Oder Chars?
< 10 Minuten Zeit zum umschreiben benutzen.
Dafür ist im Gegensatz zu Templates höhere Typensichereit gewährleistet.
Geht nicht
*lach*
Dafür brauchst du plötzlich dyn. Arrays
*lach*
Du kannst natürlich Pointer auf Integer in der TList
Was meinst du mit Pointer auf Integer ??
Dynamische Arrays sind Pointer
Arrays sind und bleiben Felder von Variablen.
Nur wurde hier mithilfe eines Pointers, dynamischer speicher reserviert und verändert.
mfg
Th3Law
-
@Th3Law: Du findest dass FOR I = 0 .. I logischerweise von 0 bis zum Anfangswert von I ausgwewertet wird, 0 .. I also EINMAL ausgewertet wird. Dann schau dir mal den C(++)-Code an:
int i = 5; for (i = 0; i <= i; i++) bla;
Die korrekte Übersetzung wäre:
int i = 5; int max = i; for (i = 0; i <= max; i++) bla;
Es ist doch irgendwo scheißegal als was etwas abstrakterweise von irgendeinem Informatik-Prof definiert wurde. Viel wichtiger ist für den Programmierer was es tatsächlich auf seinem PC ist.
Templates und keine Typ-Sicherheit? HAHAHAHAHA. Templates machen das Ganze erst typsicher.
-
< 10 Minuten Zeit zum umschreiben benutzen.
Ja, aber jedesmal, in jedem Programm wieder und wieder und wieder.
Dafür ist im Gegensatz zu Templates höhere Typensichereit gewährleistet.
Eine TList speichert untypisierte Pointer, was ist daran Typsicher?
Templates sind gerade dazu gedacht, um ein hohes Maß an Flexibilität
mit Typsicherheit zu kombinieren.Was meinst du mit Pointer auf Integer ??
Weißt du überhaupt, was Pointer so an und für sich sind???
int* PointerAufInteger;
var PointerAufInteger :^integer;
Nebenbei möcht ich dir ein kleines Geheimnis verraten:
Alle Objekte werden in Delphi über Pointer verwaltet.Arrays sind und bleiben Felder von Variablen.
var a,b :array of integer;
Auch wenn du es nicht glaubst, a und b sind hier Pointer auf ein Feld von
Variablen, insofern sind beide Aussagen in gewisserweise richtig und zugleich
falsch. Mein Problem dabei ist nur, dass der Syntax von Delphi dies verschweigt.Wo ich dabei bin, noch ein Punkt gegen Delphi (auch wenn es so schön bunt ist):
Alle Klassen, egal welcher Art, sind (direkt oder indirekt) abgeleitet
von TObject. Warum? Warum muss ein Button mit einer StringList verwandt sein?
Ist einer von euch Theoretiker genug, um mir das zu erklären?
-
Ein Speicherblock bestimmter Größe.
das stimmt basta! nur die variable enthält einen pointer auf das erste element dieses speicherblocks und wird einfach automatisch dereferenziert
std::vector ist doch auch nicht sehr viel anderes als eine Liste.
< 10 Minuten Zeit zum umschreiben benutzen.
andere haben vielleicht die zeit sowas unmzuschreiben aber ich mach in der zeit lieber was neues.
std::vector und alle darauf anwendbaren algorithmen haben mehrere tausend zeilen code und die alle anzupassen... ausserdem isses doch irgendwie käse in einem projekt immer den selben code mit kleinen unterschieden zu haben.ausserdem finde ich es irrelevant zu sagen der vorteil von templates ist nicht so gross wie alle immer denken weil man das auch anders machen kann...
"jo klar wer braucht schon klassen? ich meine das kann ich ja auch mit structs und so nachbilden..." is ungefähr eine gleich starke argumentation.und zu dem mit dem for.... wenn ich gewusst hätte was ich damit auslöse
ich hab mich ja auch nur beschwert das man mir unbedingt beibringen wollte das das ein nachteil ist... warum denn es macht vom generierten code her keinen unterschied und nur weil ich in c++ die möglichkeit hab die variable zu verändern muss ich das ja nicht tun...
[ Dieser Beitrag wurde am 06.01.2003 um 16:35 Uhr von japro editiert. ]
-
[quote von mir]
Kommentare werden in Pascal übrigens per {} gemacht!
[end quote]Für die, die es noch nicht mitbekommen haben: Wir führen hier keine C / Pascal weder noch eine C++ / Pascal sondern eine C++ / ObjectPascal Diskussion.
Ich frage mich, wie jemand, der nur sehr geringfügige Sprachkenntnisse hat einem, der offensichtlich um einiges mehr an Sprachkenntniss besitzt darauf hinzuweisen, obwohl er nicht die geringste Ahnung davon hat, dass es ein Sprachkonstrukt, was in jedem Quelltext vorkommt, in einer Sprache nicht exisitert, die überhaupt nicht zur Diskussion steht.
So, mein Kleiner, jetzt reicht's aber! Hast du schonmal nen Delphi-Quellcode gesehen? Ja? Dann müsste dir klar sein, dass dort Kommentare in geschweifte Klammern gesetzt werden. Und nochmal für dich: Delphi ist Object Pascal. Und was die Arrays angeht: mit deinen Kommentaren ist wohl klar, dass DU hier derjenige bist, der absolut keine Ahnung hat von dem, was im Speicher so abgeht. Ich glaube, es wird besser für dich sein, wenn du hier deinen Mund hältst, denn wie du siehst, wissen alle hier besser bescheid als du.
-
Hallo,
So, mein Kleiner, jetzt reicht's aber! Hast du schonmal nen Delphi-Quellcode gesehen? Ja?
Im Gengensatz zu Dir schon!
Dann müsste dir klar sein, dass dort Kommentare in geschweifte Klammern gesetzt werden
*LACH*
Und nochmal für dich: Delphi ist Object Pascal
Genauso bescheuert währe: MSVC ist C++
Und was die Arrays angeht: mit deinen Kommentaren ist wohl klar, dass DU hier derjenige bist, der absolut keine Ahnung hat von dem, was im Speicher so abgeht
Was sind Arrays denn deiner Meinung nach ?
Ich glaube, es wird besser für dich sein, wenn du hier deinen Mund hältst
DITO
denn wie du siehst, wissen alle hier besser bescheid als du.
Du bist der einzige in dieser Diskussionsrunde, der überhaupt kein Ahnung von ObjectPascal hat. Du versuchst mit deinem geringfügigem Wissen über diese Sprache herzufallen. Leider bist du anscheinend nicht dazu imstande zu merken, dass das ziemlich in die Hose geht.
mfg
Th3Law[ Dieser Beitrag wurde am 06.01.2003 um 17:06 Uhr von Th3Law editiert. ]
-
Kommentare so:
{} für einen mehrzeiligen block oder so
// für eine Zeile.Was ist so schlimm daran, wenn ein TButton mit einer TStringlist verwandt ist? Gut, sie haben nicht viel gemeinsam (außer, dass sie von TObject abstammen ).
-
Hallo,
Antwort ist sie haben nichts gemeinsam. Die Klasse TObject steht in der ObjectHieracheie jeder Klasse ganz oben!
mfg
Th3Law[ Dieser Beitrag wurde am 06.01.2003 um 18:15 Uhr von Th3Law editiert. ]
-
Aus der Delphi-Hilfe zu TObject:
TObject encapsulates fundamental behavior common to VCL objects by introducing methods that
- create, maintain and destroy instances of the object by allocating, initializing, and freeing required memory.
- return class-type and instance information on an object and runtime type information (RTTI) about its published properties.
- support message handling.
- support interfaces that the object implements.
In so fern ist es logisch, dass beide von TObject abstammen. Und genau das haben sie auch gemeinsam.
[ Dieser Beitrag wurde am 06.01.2003 um 18:56 Uhr von Luckie editiert. ]
-
Ok, eine etwas eigentümliche Vorstellung von Klassen aus Sicht von C++.
In C++ wird vorausgesetzt, dass jede Klasse diese Eigenschaften automatisch
besitzt. Aber vertretbar ist es.... obwohl es mir ein wenig quer liegt[ Dieser Beitrag wurde am 06.01.2003 um 20:55 Uhr von Taurin editiert. ]
-
Darüber kann man sich streiten, ich denke beides ist nur reine Gewohnheitssache.
Es ist trotzdem unkomfortabel, der C Standard wurde ja auch nicht umsonst geändert um zu ermöglichen, dass man überall Variablen definieren kann, wie man will
Objekte werden in Delphi, eh dynamisch erstellt.
WAS! Kein wunder, dass Delphi so laaaaaannngsaam ist Naja da wär es wohl Performanter Speicher für alle Objekte in einem Block zu belegen.
Ich glaube, es wird besser für dich sein, wenn du hier deinen Mund hältst, denn wie du siehst, wissen alle hier besser bescheid als du.
Wir sind doch alle groß und alt und müssen uns nicht angreifen!
http://community.borland.com/soapbox/techvoyage/article/1,1795,10280,00.htm#5.0
Das man 3 Möglichkeiten für Kommentare hat finde ich übrigens gar nicht schlecht, weil ich mit { } Code auskommentiere (* brauch ich für längere Kommentare und // für kurze, dass hat den Vorteil, dass ich nicht wie bei C(++) leicht mit den /**/ in Bedrängniss komme
/* blabla(); /* foo */ bar(); */
@Luckie
In so fern ist es logisch, dass beide von TObject abstammen. Und genau das haben sie auch gemeinsam.
Das ist eben der billige Trick von O Programmisprachen, die keine Templates besitzen (von wegen Typ Sicherheit!)
BTW.
Ist Object Pascal eigentlich proprietär oder gibt es da einen Standard oä.?[ Dieser Beitrag wurde am 06.01.2003 um 20:59 Uhr von kingruedi editiert. ]
-
Original erstellt von kingruedi:
**
Ist Object Pascal eigentlich proprietär oder gibt es da einen Standard oä.?
**Soweit ich weiß ist Object Pascal eine reine Borlandangelegenheit. Insofern
wird es (vermutlich) nur einen privaten Borlandstandard gegeben oder so.
-
Hallo,
dass Delphi so laaaaaannngsaam ist
Die angeblichen Geschwindigkeitsnachteile von Delphi sind Gerüchte. ObjectPascal schneidet im Geschwindigkeitstest mit C++, als beinahe gleichschnell ab (kein wunder zu Zeiten von HochOptimierung)
Naja da wär es wohl Performanter Speicher für alle Objekte in einem Block zu reservieren
Scherzbold
Das ist eben der billige Trick von O Programmisprachen, die keine Templates besitzen (von wegen Typ Sicherheit!)
Was für ein billiger Trick ?!
mfg
Th3Law
-
Original erstellt von Th3Law:
Die angeblichen Geschwindigkeitsnachteile von Delphi sind Gerüchte. ObjectPascal schneidet im Geschwindigkeitstest mit C++, als beinahe gleichschnell ab (kein wunder zu Zeiten von HochOptimierung)Hast du schon mal versucht, DirectDraw oder Direct3D Programme in Delphi
umzusetzten??? Trotz DelphiX wird das hier nicht mehr viel mit Delphi...
-
Original erstellt von Th3Law:
Was für ein billiger Trick ?!Na zB:
vector<foo>
ist dann ein
ObjectVector
und beinhaltet referenzen/zeiger auf TObjects - dh man kann es wie einen vector<foo> verwenden.
dirty hackgenerische Programmierung ist sehr maechtig. Warum schreien denn Java und .NET Entwickler nach Templates?
variablen am anfang einer funktion zu deklarieren ist nicht nur out sondern auch unpraktisch.
Fuer mich wirkt ObjectPascal wie ein verzweifelter versuch pascal in eine sprache zu verwandeln die man auch in der wirtschaft verwenden kann. IMHO ist das nicht besonders gut gelungen. Haette Delphi nicht die VCL wuerde es wohl kaum jemand verwenden. Und Delphi hat IMHO auch nur den Plusplunkt, dass es gratis ist - sonst sehe ich keinen sinn warum man nicht gleich den BCB nehmen sollte.
-
Die Diskussion, ob begin oder { oder wie die for-Schleifen genau arbeiten soll ist ziehmlich lächerlich, weil Geschmackssache.
Begin und { macht ja wohl null Unterschied außer vielleicht bei der Tipparbeit, wobei ich begin genausoschnell getippt hab wie AlgGr-7 zu drücken.
Die schleifen ist auch wurscht, weil es für jede möglichkeit sich entsprechende schleifenkonstrukte gibt.
Ich kenn mich jetzt nicht so gut in Delphi aus, hab aber früher einiges Object-Pascal programmiert. Soweit ich mich erinnere, müssen NICHT alle Klassen von einem Objekt abgeleitet sein. TObject ist das Basisobject für die VCL, für andere Bibliotheken ist das aber in keinster weise zwingen. In den MFC sind auch alle Klassen von CObject abgeleitet.
Dass alle Objekte Referenzen sind, ist eine bewusste Designentscheidung der Entwickler von Object-Pascal. Das ist auch in anderen OO-Sprachen so (Java). In C++ nicht, deswegen sind aber auch manche sachen etwas komplizierter, bzw. nicht so einsichtig, wenn man nicht täglich damit arbeiten (Copy-Ctor und ähnliche geschichten).
Dass man die Objekte an einem Platz zusammenfasst und kein neuen Scopes aufmachen kann, ist ebenfalls ein Designmerkmal und kann nicht pauschal als Nachteil angesehen werden. Und da der Konstruktor sowieso explizit aufgerufen wird, stimmt es auch nicht, dass man so Objekte instanziiert, die man womöglich garnicht braucht.
Operator-Überladung ist zwar ganz witzig, aber es macht für das Design eines Programms eigentlich keinen unterschied.
Einer der größten Vorteile von C++ gegenüber den meisten OO-Sprachen ist aber die automatische Destruktion von Objekten. Damit (RAII) kann man sich das ganze Garbage-Collection-Zeug sparen, man kann das gleiche Prinzip für jede Art von Resourcen-Belegung anwenden und tut sich leichter bei der Ausnahmebehandlung. Hier ist Delphi klar in Nachteil, weil es eben auch keine Garbage-Collection hat und man dadurch ziehmlich viel mit try-catch-finally-Klauseln arbeiten muss.
Außerdem bleiben dann natürlich noch die Templates. Delphi hat da nichts Vergleichbares zu bieten.
Dafür hat Delphi aber in der Handhabbarkeit einige Vorteile. imho ist der Code wesentlich leichter zu lesen. Ich arbeite täglich mit c++ und so gut wie nie mit Delphi, kann aber den Code in etwa gleich gut lesen. Pascal-Code ist einfach übersichtlicher. Von der Geschwindigkeit sind Delphi-Progs in der Praxis (außer bei hoch-Performance-Anwendungen) wohl gleichwertig, mir ist aber noch nie ein C++-Compiler untergekommen der nur annäherungsweise so schnell compiliert wie Delphi.
In C++ hat man natürlich sehr viel mehr Spielraum für sein Programmdesign, weil mehr Sprachparadigmen unterstützt werden. Andrerseits hat das auch zur folge, dass man nur einen geringen Teil der Sprache wirklich nutzt (und jeder Programmierer nen anderen) und man schon einiges an Lehrzeit investieren muss, bevor man richtig produktiv mit arbeiten kann. In Delphi wird man viel schneller produktiv, irgendwann fühlt man sich aber vielleicht eingeengt. C++ gleicht insofern eher einer natürlichen gewachsenen Sprache mit vielen eleganten und auch unschönen Möglichkeiten, etwas auszudrücken, Delphi ist halt mehr einfach gestrickt.