bool Array mit variabler Größe vererben
-
Hallo,
ich programmiere ein Schiffe versenken und arbeite mich in Vererbung ein.
Das bool-Array isHit (sagt an welcher Stelle das Schiff getroffen wurde) soll je nach Schiffartgröße (Kreuzer, Uboot etc) vererbt werden.Wie mache ich das ?
-
Gar nicht, Member macht man immer private. Ein rohes Array willst du auch nicht, du willst entweder std::array oder std::vector.
-
Machst du das der Übung wegen so umständlich? Ich würde dazu 2 UINT's nehmen, einmal für die gezählten Treffer, und einmal für max Treffer, letzteres kannste ja per konstruktor verändern.
Oder ein ein UINT was runter zählt, und bei 0 das schiff sinken lässt.Und ich halte es für ein Gerücht, das member IMMER private sein müssen. Protected reicht bei sowas vollkommen.
-
anti-freak schrieb:
Und ich halte es für ein Gerücht, das member IMMER private sein müssen. Protected reicht bei sowas vollkommen.
Ein Protected Data-Member ist nicht viel besser als ein public. Jeder kann davon ableiten und hat dann vollen Zugriff drauf, wenn ich den Member in der Basisklasse verändere, muss ich alle abgeleiteten Klassen anpassen...
Aber im konkreten Beispiel willst du ja eigentlich gar nicht das Array vererben. Abgesehen davon, dass ich mir an deiner Stelle überlegen würde, warum du da überhaupt Vererbung einsetzen willst, wäre es doch eine viel bessere Lösung, einfach eine protected oder public Methode anzubieten, die nachschaut, ob im Array der Wert true steht...
-
314159265358979 schrieb:
Gar nicht, Member macht man immer private. Ein rohes Array willst du auch nicht, du willst entweder std::array oder std::vector.
Quark, mal wieder, leider.
Ein Array in einer Klasse ist doch nicht mehr roh.anti-freak schrieb:
Protected reicht bei sowas vollkommen.
Würdest du deine Kinder im echten Leben auch unbeaufsichtigt an deinen wertvollsten Sachen rumspielen lassen?
Mach alle Member private, wenn du nicht sehr gute Gründe dagegen hast (die hast du nicht). protected macht nur, dass du an der Basisklasse nichts mehr ändern kannst, ohne Funktionalität der Kinder zu gefährden. Nimm Zugriffsmethoden, wie es sich gehört.
eine sehr viel ausführlichere Begründung:
http://www.gotw.ca/gotw/070.htm
-
SeppJ schrieb:
314159265358979 schrieb:
Gar nicht, Member macht man immer private. Ein rohes Array willst du auch nicht, du willst entweder std::array oder std::vector.
Quark, mal wieder, leider.
Ein Array in einer Klasse ist doch nicht mehr roh.Genau, dann ist es gekocht. Aber das ist genauso Quark, kein std::array oder std::vector nur weil etwas in einer Klasse ist. Ein einfacher Array-Pointer bleibt so wie er ist, egal wo er ist.
Furtano schrieb:
Hallo,
ich programmiere ein Schiffe versenken und arbeite mich in Vererbung ein.
Das bool-Array isHit (sagt an welcher Stelle das Schiff getroffen wurde) soll je nach Schiffartgröße (Kreuzer, Uboot etc) vererbt werden.Wie mache ich das ?
Ehrlich gesagt halte ich Schiffe versenken nicht gerade für ein gutes Beispiel um etwas mit Vererbung zu machen. Da würde ich nur ein Spielfeld machen auf dem Zahlen sind, die Zahlen sind die Schiffe, und ein Array das weiß wieviel Zahlen es sind. Immer alle Schiffe durch zu gehen, um zu sehen, ob eines getroffen wurde, fühlt sich einfach so langsam an, auch wenn man es nicht merken wird.

-
ob ich das element aus einer child class direkt ansprechen kann, oder über get/set kommt doch letzendlich aufs gleiche raus. sofern ich nicht irgendwelche beschränkungen habe (x soll nur maximal so groß werden wie y oder solche sachen) ist es doch das gleiche in grün. daher verstehe ich nicht, warum ich extra noch einen schlenker durch die parent machen soll (was wieder ein wenig teurer ist, als das element direkt anzusprechen), nur weil ich es nicht protected machen soll.
sry für OT, aber es passt hier imo ganz gut rein

-
Branchenexperte schrieb:
Immer alle Schiffe durch zu gehen, um zu sehen, ob eines getroffen wurde, fühlt sich einfach so langsam an, auch wenn man es nicht merken wird.

Und wie merkst du dann, wann ein Spieler gewonnen hat? Immer alle Elemente des Arrays durchgehen!?

-
anti-freak schrieb:
ob ich das element aus einer child class direkt ansprechen kann, oder über get/set kommt doch letzendlich aufs gleiche raus. sofern ich nicht irgendwelche beschränkungen habe (x soll nur maximal so groß werden wie y oder solche sachen) ist es doch das gleiche in grün.
Nein absolut nicht das selbe. Lies den von SeppJ verlinkten Artikel.
anti-freak schrieb:
daher verstehe ich nicht, warum ich extra noch einen schlenker durch die parent machen soll (was wieder ein wenig teurer ist, als das element direkt anzusprechen), nur weil ich es nicht protected machen soll.
Siehe Artikel. Noch dazu kostet es nichts.
Aus Sicht einer abgeleiteten Klasse ist ein protected Member das gleiche wie ein public Member und bringt damit auch die gleichen Probleme mit sich.
Wenn du micht fragst, ist die Tatsache dass du einen Member protected machen willst, überhaupt ein Hinweis drauf, dass dieser Member schon rein logisch erst gar nichts in einer Basisklasse verloren hat. Vererbung ist nicht einfach zur Einsparung von Tastendrücken gedacht
-
Und es ist auch der falsche Ansatz dieses gekapselte bool-Array an die Schiffe zu vererben. Das U-Boot oder der Kreuzer sind doch keine isHits??
-
dot schrieb:
Branchenexperte schrieb:
Immer alle Schiffe durch zu gehen, um zu sehen, ob eines getroffen wurde, fühlt sich einfach so langsam an, auch wenn man es nicht merken wird.

Und wie merkst du dann, wann ein Spieler gewonnen hat? Immer alle Elemente des Arrays durchgehen!?

Die kann man auch ganz einfach runterzählen.
-
Stimmt

-
SeppJ schrieb:
Ein Array in einer Klasse ist doch nicht mehr roh.
Für die Klasse selbst schon. Das ist bereits eine Fehlerquelle, die man mit
std::arrayweniger hat. Ausserdem kann man sich so Assertions sparen und direkt auf ein STL-Interface zugreifen...
-
OK, man kann es auch schön objektorientiert machen. Dann registrieren die Schiffe Observer für einzelne Spielfelder und bekommen ein Event, wenn auf ein Feld geschossen wird. Das Schiff selber kann dann wieder ein "Zerstört" Event versenden, dann braucht man auch keine Liste von Schiffen durchgehen. Wird halt ganzschön aufgebläht für ein so einfaches Spiel. :xmas1: