Was ist denn mal ne WIRKLICH gute String-Klasse?
-
z.B. musst du Prototypen von Funktionen schreiben.
Nein, lass es mich anders formulieren:
C++ ZWINGT dich dazu, Prototypen bzw. Funktionsdefinitionen vor dem ersten Aufruf zu schreiben.C++ does not allow implicit function declarations. It is invalid to call a function that does not have a previous declaration in scope.
Ich bin jetzt grad zu faul, nach mehr Einschränkungen zu suchen. Java ist sogar noch mehr eingeschränkt:
- jeglicher Code muss in Klassen stehen.
- eine variable eines Blocks darf nicht genau so heißen wie eine Variable, die es schon vorher (außerhalb dieses Blocks) gibt.
- Zahlenwerte können nicht bool-Werten zugewiesen werden.
- usw.[Ironie]
Die Entwickler haben sich dabei natürlich überhaupt nichts gedacht und das sind alles nur unnötige Einschränkungen. Da die Sprachen immer eingeschränkter werden, bleiben halt dann manche Leute, die mehr Freiheiten wollen, am besten bei den Vorgängersprachen.
[/Ironie]
-
LOL
-
Optimizer schrieb:
z.B. musst du Prototypen von Funktionen schreiben.
Nein, lass es mich anders formulieren:
C++ ZWINGT dich dazu, Prototypen bzw. Funktionsdefinitionen vor dem ersten Aufruf zu schreiben.Ich weiß nicht so genau was Du meinst ?! Also in Java wirst Du sicherlich auch alles bekanntmachen müssen bevor Du es nutzt. Wenn Du Prototyp im sinne von
void foo(); meinst:
void bar() { } void foo() { bar(); } int main() { foo(); }
Gezwungen wirst Du da nu nich ?!
-
Du musst in Java keine Prototypen schreiben. Du musst in Java nicht mal eine Klasse erst definieren, um sie verwenden zu können:
class A { B objekt } class B { int bla; }
geht bei mir zumindest nicht!
in Java ist das kein Problem, da steht sowieso jede Klasse in einer eigenen Datei.Das stört mich bei C++ ziemlich, dass man alles in der richtigen Reihenfolge deklarieren muss. Dadurch kann ich auch oft Methoden nicht innerhalb der Klasse definieren und muss in die Klasse wieder ne Deklaration setzen.
P.S.: in Java gibt es kein int main(), das war jetzt wohl kein Java-Code?
-
Optimizer schrieb:
Du musst in Java keine Prototypen schreiben. Du musst in Java nicht mal eine Klasse erst definieren, um sie verwenden zu können:
class A { B objekt } class B { int bla; }
geht bei mir zumindest nicht!
in Java ist das kein Problem, da steht sowieso jede Klasse in einer eigenen Datei.Wo ist da deine Klasse nicht definiert? Du hast doch 'class B {blabla}'
geschrieben, also hast du die Klasse damit definiert.Das stört mich bei C++ ziemlich, dass man alles in der richtigen Reihenfolge deklarieren muss. Dadurch kann ich auch oft Methoden nicht innerhalb der Klasse definieren und muss in die Klasse wieder ne Deklaration setzen.
Versteh ich net. Du deklarierst deine Methoden in deiner Klasse, ist doch ne
voellig normale Sache.P.S.: in Java gibt es kein int main(), das war jetzt wohl kein Java-Code?
Ich glaube dort heisst die Funktion 'static int main()'
mfg
v R
-
Ne Java Code wars nich. Ich hab mit Java noch nix am hut, deswegen frag ich ja nu so viel nach.
Du musst doch in der Unit in der Klasse A verwendet wird irgendein Bezug in Klasse B erzeugen, und wenns ein Include ist?
-
Wenn du mehr Freiheiten willst, dann verwende doch einfach C. C++ schränkt dich unnötig ein.
hä? Schonmal versucht in C funktional zu Programmieren? Erst durch die Templates ergeben sich Möglichkeiten sowas umzusetzen. Und OOP in C ist eher ein Krapf, als Programmieren. Das ist ziemlich behindernd.
Und ich brauche keinen tollen [Ironie]-Tags, um deinen Sarkasmus zu erkennen. Ich sehe das als Beleidigung.
Das stört mich bei C++ ziemlich, dass man alles in der richtigen Reihenfolge deklarieren muss. Dadurch kann ich auch oft Methoden nicht innerhalb der Klasse definieren und muss in die Klasse wieder ne Deklaration setzen.
Allgemein stimm ich dir zu. Nur grade dein letztes Beispiel ist der einzige Fall in C++, wo genau das nicht gilt. Innerhalb der Klasse verhält sich das scoping quasi genau wie in Java.
-
Helium schrieb:
Allgemein stimm ich dir zu. Nur grade dein letztes Beispiel ist der einzige Fall in C++, wo genau das nicht gilt. Innerhalb der Klasse verhält sich das scoping quasi genau wie in Java.
// mein letztes Beispiel? Meinst du das? class SomeTests { Test myTest1; Test myTest2; }; class Test { int x; }; int main() { SomeTests harhar; return 27; }
Ich enttäusche dich nur ungern, aber... das wird nicht compiliert. Wenn ich die Klasse Test zuerst definiere, geht es.
virtuell Realisticer schrieb:
Wo ist da deine Klasse nicht definiert? Du hast doch 'class B {blabla}'
geschrieben, also hast du die Klasse damit definiert.Ja hab ich. Und nein es geht nicht. Siehe oben.
virtuell Realisticer schrieb:
Versteh ich net. Du deklarierst deine Methoden in deiner Klasse, ist doch ne
voellig normale Sache.Ja das ist leider normal. In Java kann (muss sogar) man die Methoden direkt in die Klassendefinition schreiben (also definieren).
@Knuddlbaer: Ich weiß leider nicht, was du meinst.
Also in Java steht der ganze Code in Klassen. Und jede Klasse steht in einer eigenen Datei. Wenn man damit erstmal gearbeitet hat, wird man diese Einschränkung begrüßen.
Die main()-Funktion steht auch in einer Klasse. Damit man darauf überhaupt zugreifen kann, ist sie alspublic static void main(String[] args)
definiert.
Ein Vorteil dieser Einschränkungen ist z.B. dass es keine globalen Variablen (sonder nur noch static) geben kann.Weiß eigentlich jemand, ob C# zur Spieleentwicklung taugt? C# ist nämlich eigentlich die selbe Sprache wie Java (darf man das überhaupt so dreist kopieren?).
-
Optimizer schrieb:
Ein Vorteil dieser Einschränkungen ist z.B. dass es keine globalen Variablen (sonder nur noch static) geben kann.
und voll in die Falle rein. Was hilft dir das? du versteckst quasi dann alle globalen Daten hinter ner Fassade. Bis auf reduzierende namespace pollution sehe ich nur semantische verluste
-
du versteckst quasi dann alle globalen Daten hinter ner Fassade.
Nein, ich räume sie auf. Man sollte auch in C++ keine globalen Variablen verwenden, sondern sie in Klassen einsortieren.
-
Optimizer schrieb:
Man sollte auch in C++ keine globalen Variablen verwenden, sondern sie in Klassen einsortieren.
und dadurch wirds dann besser
-
Optimizer schrieb:
Ja das ist leider normal. In Java kann (muss sogar) man die Methoden direkt in die Klassendefinition schreiben (also definieren).
@Knuddlbaer: Ich weiß leider nicht, was du meinst.
Also in Java steht der ganze Code in Klassen. Und jede Klasse steht in einer eigenen Datei. Wenn man damit erstmal gearbeitet hat, wird man diese Einschränkung begrüßen.Also in C++ wird oder zumindest sollte man jede Klasse in eine extra Datei schreiben.
Und auch in C++ kannst du deine Methoden direkt in der Klasse definieren. Das sollte eigentlich kein Problem darstellen.
-
PuppetMaster2k schrieb:
Optimizer schrieb:
Ja das ist leider normal. In Java kann (muss sogar) man die Methoden direkt in die Klassendefinition schreiben (also definieren).
@Knuddlbaer: Ich weiß leider nicht, was du meinst.
Also in Java steht der ganze Code in Klassen. Und jede Klasse steht in einer eigenen Datei. Wenn man damit erstmal gearbeitet hat, wird man diese Einschränkung begrüßen.Also in C++ wird oder zumindest sollte man jede Klasse in eine extra Datei schreiben.
Und auch in C++ kannst du deine Methoden direkt in der Klasse definieren. Das sollte eigentlich kein Problem darstellen.Sie sind aber dann inline und man sollte nur kleine Funktionen 'inlinen'.
Was ist so schlimm daran, Deklaration von Implementation zu trennen? Dadurch wird der gesamte
Aufbau doch gleich wieder uebersichtlichermfg
v R
-
Nicht nur dass sie inline sind, es geht auch oft einfach nicht, wenn die Methoden wieder auf andere Variablen zugreifen sollen, die erst danach definiert sind - das alte Problem.
class Soldat { void KillRandomSoldat() { soldaten[rand].Die() // Geht nicht, weil soldaten erst unten definiert ist! } void Die() { bla; } } Soldat soldaten[200];
Erst soldaten definieren geht auch nicht, weil die Klasse Soldat nicht bekannt ist. Sowas ist einfach ätzend, sorry.
-
Ne ich find sowas geil
Was passiert wenn int soldaten definiert ist ?
Der Compiler schnallt es erst wesentlich später, er kann kaum prüfen.
(ok ich hab keine Ahnung von was ich rede ich kenne Java nicht, aber ich denke das hier nun mal die Typprüfung drunter leidet wenn man sachen verwenden kann die erst später bekannt werden ?!?)Zudem hast Du hier die Soldaten global liegen, das gehört sich nicht.
Mit einem anderen Design lässt sich das wohl besser lösen ;o)
-
also das ist wirklich aetzend. und zwar dein design. das muss army.killRandomSoldat() heissen.
und das mit dem inline ist kein problem, der compiler weiss schon, ob er inlinen sollte oder nicht.
-
Nix army. Ich will dass ein Soldat einen anderen killt. Damit du vielleicht besser verstehst warum: Der andere Soldat soll nicht nur sterben, der Soldat der schießt, soll auch noch Munition verbauchen, und die Hundemarke vom getöteten Soldaten mitnehmen (also in das eigene Objekt speichern). Also wie willst du army.KillSoldat() schreiben?
btw, das ist jetzt natürlich alles frei erfunden, aber es zeigt doch, dass man es am besten wieder mal mit nem Prototypen innerhalb der Klasse löst, und die Funktionsdefinition außerhalb schreibt - leider.
Was passiert wenn int soldaten definiert ist ?
Der Compiler schnallt es erst wesentlich später, er kann kaum prüfen.
(ok ich hab keine Ahnung von was ich rede ich kenne Java nicht, aber ich denke das hier nun mal die Typprüfung drunter leidet wenn man sachen verwenden kann die erst später bekannt werden ?!?)Wieso _int_ Soldaten??
Und wieso sollte bei Java die Typprüfung darunter leiden? Die Sachen werden nicht später bekannt. Sobald die Rede von Soldat ist, schaut der Compiler halt nach, ob es die Klasse gibt und ob die Klassendeklaration mit den Aufrufen zusammenpasst.
-
@Optimizer: Sorry hatte deine Aussage anscheinend etwas missverstnaden. So wie du es meintest geht es natürlich nicht.
Warst du eben nicht gegen gobale Variablen? und jetzt hast du ein Problem, weil etwas im zusammenhang mit 'ner globalen Variable nicht funktioniert?
Und eine öffentliche statische Variable verhält sich genau wie eine globale Variable. Jeder kann dran rumbasteln wie er will.
-
beinahe, denn mit static geht das, was Optimizer will, afair schon:
class test { public: void tester (int i) { tests[0].tester(i+1); if (i > 100) return; } static test tests[100]; }; test test::tests[100]; int main () { test x; x.tester(0); }
-
Momemt, ich weiß was du meinst, aber ist hier die Methode tester nicht rekursiv?
Auf jeden Fall müsste es mit dem statischen Array gehen, ja. Ich bin darauf ehrlich gesagt gar nicht gekommen. Aber in Java hätte ich es so machen MÜSSEN
EDIT:
Und eine öffentliche statische Variable verhält sich genau wie eine globale Variable. Jeder kann dran rumbasteln wie er will.
Natürlich. Aber du verwechselt sie nicht mehr so leicht, weil jedesmal Klasse:: davor steht. Ich finde es auf jeden Fall eindeutiger. Die meisten Bücher sind auch der Meinung, dass globale Variablen eher schlecht sind.