Was ist denn mal ne WIRKLICH gute String-Klasse?
-
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.
-
in C++ gibt es aber auch noch namespaces.
-
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.
Wenn eine einzelne Variable eindeutig zu einer Klasse von Objekten gehört, sollte Sie auf jeden Fall statisches Mitglied der Klasse sein. Ist diese Zugehörigkeit aber nicht gegeben ist es unsinn Sie einfach in eine Klasse zu packen. Dafür gibt es aber Namensräume. Da es die in Java nicht gibt, ist man gezwungen Sie in eine Klasse zu packen. Man gebraucht (ich sage absichtlich nicht misbraucht) eine Klasse dann als Namensraumersatz, was durchaus legitim ist, da die Sprache keine bessere Art bietet das auszudrücken, was man will. Aber Wie gesagt Java ist nicht C++.
-
wenn ein soldat einen beliebigen aus einer gruppe von feinden killen soll, dann wuerde ich soldat.kill(feinde) sagen.
-
Hm, ich kenne das Grundproblem nicht das Du hast, aber bis jetzt erscheint es mir eher ein Designproblem zu sein als eine schwäche von C++.
Wie Hume bereits sagte: Du kannst in C++ nicht wie in Java Programmieren und wie Volker bereits sagte: Wenn Dir C++ nicht passt und Java lieber ist, musst bei Java bleiben ;o)
-
Ich glaube das Problem mit den Soldaten war eindeutig. Die einzige Lösung (ohne Prototyp) war die mit dem statischen Array, wie davie richtig bemerkt hat.
Und nochmal wegen dem Java: In Java wäre man sofort auf diese Lösung gekommen, weil es dort keine andere Möglichkeit (Prototypen und globale Variablen) gibt. Wir haben also gerade in C++ wie mit Java programmiert.Und vielleicht verstehen jetzt einige, warum die Einschränkungen in Java zu begrüßen sind.
Genauso wie einige Einschränkungen von C++ gegenüber C gut sind. Das war eigentlich der Anfang der Diskussion (aber immer noch Offtopic ;o).
-
Hmm... Da haste mich aber noch nichit davon Überzeugt.
Ich kenne den Kontext nicht in dem es den Soldaten geben soll, aber ich bin mir sicher das man bei einem vernünfitgen Design erst garnicht ein solches Problem hätte ;o)
-
Also ich glaube, der Thread hat so langsam nichts mehr mit dem urspruenglichen Thema zu tun.
mfg
v R
-
Nö das nicht, aber man konnte ein wenig was über Konzepte in Java lernen