C++ Klasse, Methode, Vererbung
Ich habe vor kurzem umgestellt von Java zu C++, und ich bin mit einigen Schwierigkeiten arbeiten Sie heraus, wie die Vererbung genau funktioniert. Heute habe ich die Klasse Weapon
und die Klasse Minigun
. Minigun
erbt die Klasse Weapon
, was bedeutet, es sollten über die Methoden und Variablen, die Weapon
definiert. Mein Problem ist, dass ich eine private Konstante static int innen Weapon
genannt rate
, und eine öffentliche Methode, die eine Ganzzahl zurückgibt genannt getRate()
. getRate()
gibt einfach die rate Variablen wie in der Klasse definiert. Wenn Minigun
erstreckt Weapon
, und ich habe die rate innerhalb Minigun
, die getRate()
Methode noch gibt die Konstante aus der Weapon
Klasse, auch wenn es aufgerufen wird, auf der Minigun
Klasse. Ich dachte, es würde wirken wie Java, und das intherited Methode würde die geänderte variable in Minigun
. Aktuell habe ich das folgende zu tun;
Waffe.h
#ifndef __WEAPON__
#define __WEAPON__
class Weapon
{
public:
virtual int getRate()
{
return rate;
}
private:
const static int rate = 0;
};
#endif
Minigun.h
#include "Weapon.h"
#ifndef __WEAPON_MINIGUN__
#define __WEAPON_MINIGUN__
class Minigun: public Weapon
{
public:
int getRate(); //I have to define this here, and create it inside Minigun.cpp
private:
const static int rate = 30;
};
#endif
Minigun.cpp
#include "Minigun.h"
int Minigun::getRate() //Is there a way so I do not need to type this out for every class that extends Weapon?
{
return rate;
}
return Minigun::rate;
im minigun .cpp. Keine gaurenteeMeine Minigun.cpp funktioniert gut, ich bin auf der Suche, um vollständig zu entfernen getRate () - Funktion aus Minigun.cpp, und verwenden Sie eine bereits definierte Waffe
entfernen rate von Klasse minigun und die Funktion getrate. Beim Aufruf von Funktionen minigun, Sie rufen einfach die geerbten Funktionen.
Wenn ich entfernen, die getRate() inside-Waffe genannt wird (was ich will), aber es gibt die "Geschwindigkeit" konstant vom inneren der Basis Waffe-Klasse, anstelle von der Innenseite der Minigun.
Ich bin mir nicht sicher, ob das überladen funktioniert für statische Variablen in einer Klasse oder nicht, aber warum nicht einfach eine Funktion benutzen, wird der Wert direkt (z.B.
return 30;
) wenn es das const sowieso.InformationsquelleAutor Jack Wilsdon | 2013-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben es nicht statisch sein. Zum Beispiel:
Deklarieren wir einen geschützten int in der base-Klasse. Dies bedeutet, dass jede abgeleitete Klasse erbt die Basisklasse, wird die variable als gut. Sie nur eine variable deklarieren, die
static
wenn Sie nur eine Instanz, die shared variable für alle Instanzen des Objekts.Base-Konstruktoren werden aufgerufen, bevor die abgeleitete Konstruktor. Sie können reset-default-Werte in der abgeleiteten Konstruktor für Objekte dieses bestimmten Typs. Öffentliche Funktionen aufrufen, die meisten abgeleitet die virtuelle Funktion. In diesem Fall wollen wir
Minigun
sich so verhält, für unsere rate-Funktionen, so dass wir einfach nicht umsetzen, jede Funktion fürMinigun
so dieWeapon
Funktionen aufgerufen werden, statt.Ausgabe:
Es scheint immer noch ein Problem mit meiner version. Wenn mit der Konstruktor
Minigun::Minigun() { rate = 30 }
im inneren des Minigun.cpp, bekomme ich eine Fehlermeldung, die besagt, dassWeapon::rate
ist privat. Was kann ich tun, über diese andere als die Verwendung eines setter - /getter-combo?protected:
stellen Sie sicher, es ist deklariert alswenn Sie wirklich brauchen, rate private, schaffen einen geschützten (oder öffentlichen) setter.
InformationsquelleAutor Chemistpp
Weapon
Instanzen zurückkehren würde eine rate vonWeapon::rate
durchgetRate()
undMinigun
Instanzen zurückkehren würde eine rate vonMinigun::rate
.Da die Methode
getRate()
ist eine virtuelleWeapon
Zeiger oder ein Verweis auf eineMinigun
Instanz zurückgeben würde eine rate vonMinigun::rate
.Wenn nur die rate variable änderungen in den abgeleiteten Klassen, eine Vorlage-Klasse erfordern würde, ist weniger Codierung als das dynamische polymorphe version. Die template-version würde so Aussehen:
InformationsquelleAutor a.lasram