Statische Konstanten / Vererbung
-
Hoi, hab ne kurze Frage:
class Waffe { public: virtual void feuer() { wcout << range << "\n"; } protected: static const int range = -1; }; class G36 : public Waffe { protected: static const int range = 800; }; class G22 : public Waffe { protected: static const int range = 2500; };
Wenn ich jetzt ein G36 Objekt erstelle und feuer, dann wird -1 ausgegeben. Wie erreiche ich, dass die abgeleiteten Klassen, das range redefinieren?
-
Um Speicher zu sparen: Eine virtuelle Funktion draus machen (das naheliegendste?).
Um evtl. Prozessortakte zu sparen: Waffe zu einem Interface machen, eine Zwischenklasse (WaffeImpl<> oder so) einführen, die als template-Parameter range annimmt und Waffe implementiert.
Das fällt mir nur so spontan ein...
-
Ne virtualle Funktion ist es bereits.
Klassen-Templates find ich jetzt nicht so geschickt, weil dann hätte ich Code wie:class abgeleiteteWaffe<500>
-
Entweder Du mußt die virtuelle Funktion in jeder Klasse neu überschreiben, damit er den dortigen Wert nimmt, oder Du fügst ne virtuelle Funktion getRange() hinzu, die Du jeweils geeignet implementierst.
Eine andere alternative wäre eine protected-Funktion setRange anzubieten, über die der Konstruktor einer abgeleiteten Klasse die Reichweite einstellen muß (z.B. im Konstruktor).
MfG Jester
-
Dann werd ich wahrscheinlich getRange() jedes mal neu definieren. Die letzte Möglichkeit würde ja vorsehen, dass jedes G36 sein eigenes range mit sich herumschleppt, wenn ich das richtig verstehe...
-
Hi,
also ich würde auch Templates verwenden, ist doch nichts dabei.
Das sähe dann z.B. so aus:template<int t_nRange> class CBase { public: void feuer() { wcout << range << "\n"; } protected: static const int nRange = t_nRange; }; class G36 : public CBase<800> { }
Nachher merkt man von den Templates doch garnichts mehr, also mir gefällt die Lösung.
MfG MAV
-
Was spricht eigentlich gegen eine ganz simple Membervariable?
-
Bashar schrieb:
Was spricht eigentlich gegen eine ganz simple Membervariable?
Der immense Speicherverbrauch. Optimizer will wahrscheinlich eine Waffenkammer wie in Matrix 1 realisieren
.
-
*rofl*
Ne, aber es widerspricht einfach meinem Verständnis. range = 800 ist etwas, was sich alle G36 teilen, also warum nicht statisch?
Außerdem ist das hier nur ein frei erfundenes Beispiel, in der Praxis hab ich jetzt schon mal einen 3D-Vektor, zwei ints und einen Zeiger als solche Datenelemente und es könnte auch mal was größeres sein.
-
Dann mach eine Klasse Waffentyp, die alle relevanten Werte enthält, und gib jeder Instanz eine Referenz auf ihren Typ.
-
Das ist in der Tat eine Idee.