C++ ist die Erstellung einer Kind-Klasse von einer Übergeordneten Klasse, die bereits initialisiert wurden
Habe ich eine Klasse "Player". Seine Mitglieder sind einfache Zeichenfolgen und Ganzzahlen und die habe ich Getter und Setter für jedes dieser...grundlegende Dinge: (es ist eine Belastung der Mitglieder so ich habe gerade 3 zum verkleinern der code):
- PLAYER.H
class Player
{
private:
string Name;
string Role;
int FFDefence;
......etc
public:
//constructor function
Player(
string Name = "Not Stated",
string vRole = "Not Stated",
int vFFDefence = 0,
......etc
)
//Getter Functions
string GetName() const;
string GetRole() const;
int GetFFDefence() const;
.....etc
//Setter Functions
void SetName (string x);
void SetRole(string x);
void SetFFDefence(int x);
......etc
};
PLAYER.CPP
Player::Player( string vName,
string vRole,
int vFFDefence,
......etc
{
Name = vName;
Role = vRole;
FFDefence = vFFDefence,
......etc
}
//getter functions
string Player::GetName() const {return Name; };
string Player::GetRole() const {return Role; };
int Player::GetFFDefence() const {return FFDefence; };
.....etc
//Setter Functions
void Player::SetName(string x) { Name = x ; };
void Player::SetRole(string x) { Role = x ; };
void Player::SetFFDefence(int x) { FFDefence = x ; };
......etc
Also ja - ziemlich Moor-standard......jetzt habe ich eine zweite Klasse, wo einer der member-Funktionen ist ein Spieler der Klasse selbst.
TEIG.H
class Batter
{
private:
Player ID;
int Touch;
....etc
public:
Batter(Player vID, int vTouch = 0....etc);
//Getter Functions
string GetRole() const;
int GetFFDefence() const;
int GetBFDefence() const;....and so on.
OK - das ist der code aus dem Weg!!!!
Also habe ich alles tun, was ich will im Hinblick auf die übergabe von Variablen in und out....so kann ich erstellen
Player Dave ("Dave", "Opener", 98, ....etc)
dann später (wenn ich es brauche) zu erstellen
Batter OnStrike (Dave, 10, .....etc)
Alle Soße....OK, also ich habe angefangen zu suchen, in die Vererbung und erkannte, dass dies ist, was ich tun sollte....zurück konvertieren kein problem (habe dies mit arrays und Vektoren den anderen Tag)...
Hier ist mein problem:
Mit, was ich habe, nun, ich kann es schaffen "- Spieler Dave" und übergeben Sie ihn in die Unterklasse der Teig, wenn ich muss. Wie mache ich das gleiche mit traditionellen Vererbung? Wie kann ich eine bestimmte Instanz (bereits erstellt) Player verwenden, als die Eltern für eine bestimmte Instanz der Kind-Klasse Teig? Soweit ich das ableiten kann, im moment, müssen Sie beide zur gleichen Zeit.
InformationsquelleAutor Hillsy7 | 2013-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur initialisieren Sie Ihre Basis-Objekt mit dem Objekt zur Verfügung gestellt:
Auf der anderen Seite, es ist die Frage, ob die Vererbung von
Batter
ausPlayer
ist das richtige Werkzeug in Ihrem Fall. Die Tatsache, dass Sie passieren einePlayer
Objekt Konstruktion Hinweise auf die Tatsache, dass ein Spieler kann werden einen Teig, und vielleicht später auch nicht mehr als Teig. Das istBatter
ist eigentlich ein Rolle, die den Spieler vorübergehend haben. Daher kann es eine bessere Idee zu trennen, diePlayer
Objekt aus der Rolle, durch einen separatenRole
Hierarchie, woBatter
undPitcher
stammen ausRole
, undPlayer
hat eine Methode gibt die aktuelle Rolle, und andere, die können, weisen Sie einer anderen Rolle auf den Spieler.ACK! Sorry, wusste nicht, dass "copy-Konstruktor" war eine eigentliche Begriff..(wie ich schon sagte, selbst zu unterrichten und nur ein paar Wochen)....Ich werde gehen und Lesen Sie diese...
Holen Sie sich ein Buch, aufhören zu versuchen, zu lernen eine sehr komplizierte Sprache via stackoverflow
InformationsquelleAutor celtschk
Die Idee mit Polymorphismus ist, dass, wenn Sie haben einige Klasse:
Dann jeden Teig ist auch ein Spieler. So, zum Beispiel, wenn Sie hatte ein Teig namens
dave
, Sie würde in der Lage sein zu verwendendave
wo ein Spieler zu erwarten war. Sie könnten zum Beispiel:Seien Sie vorsichtig, zu vermeiden Sie schneiden, das ist, wenn Sie aus versehen eine Basisklasse Exemplar einer Unterklasse (dieser nicht erhalten Unterklasse bestimmten Zustand. Wenn Sie brauchen, um passieren
dave
herum, stellen Sie sicher, dass Sie nur finden zudave
, nicht kopierendave
.dave
mag es nicht, kopiert zu werden.)Wie genau bauen Sie Ihre Spieler und Teige ist bis zu Ihnen. Zum Beispiel, Ihre möglicherweise Konstruktoren mit diesen Unterschriften:
Unter gewissen Umständen mag dies bequem sein, aber es ist nicht besonders effizient, weil Sie haben zu erstellen und kopieren Sie die Basis-Klasse (nicht, dass Effizienz eine große Sache für kleine Klassen wie diese, aber es gibt keinen Punkt in versuchen, Dinge zu tun, die dumme Art und Weise). Sie wäre besser dran, einen Konstruktor, alles, was es braucht, und verwendet Unterobjekt Initialisierung:
Aber Ihre Umsetzung ist letztlich Ihnen überlassen.
....4.... Dies ist, wie ich es verstehe, aber bedeutet das, dass ich die Getter-Funktionen aus der zuvor erstellten 'Player', um die neue Base 'Spieler' die gleichen?
InformationsquelleAutor Wug
Du tust aggregation hier nicht die Vererbung. Ein Batter hat ein Spieler. Erbschaft wäre ein Teig ist ein Spieler.
Dein design ist gut, Sie nicht tun wollen erbschaft.
Während es ist okay zu sagen, dass ein Teig ist immer ein Spieler aus einer konzeptionellen Sicht in diesem Fall, wenn Sie es mit einem Teig, viel von dem, was der Spieler beschreibt, ist irrelevant und beim Umgang mit Ihnen als Spieler, Sie können nicht mit der Wimper.
Baseball ist ein bisschen Fremd für mich, aber wenn Sie ging in das Erbe der route, die Sie haben würden, die Nachkommen der Spieler für jede Rolle im team und Holen Sie sich in einem rechten Durcheinander, wenn Ihr pitcher kam heraus, um Schläger.
Eine klassische illustration der Vererbung route.
Ist
Wo setzen Sie Bat und Strauß?
Hast du nur noch sagen, dass eine Fledermaus ein Vogel ist, erfinden Sie eine neue Klasse FlyingRodent, oder ein Nagetier mit zwei Eltern...
All das führt zu einer verwirrenden bug fest.
Anzeigen alle unbewussten reicht für die Vererbung hammer mit extremen Misstrauen.
Ja das ist die aggregation. wenn du an einem Objekt zum anderen, es ist die aggregation. Wenn Sie sagten, ein Läufer ist ein Mensch, dann sind Sie sagen Sie können nur die Modellierung des Menschen. Wenn der Läufer sein könnte, die Hunde oder Pferde, dann aggregation ist der Weg zu gehen.
Toll - vielen Dank!
InformationsquelleAutor Tony Hopkinson
Es wirklich hängt davon ab, wie Sie eigentlich wollen, dass Ihr code einkalkuliert.
Werden von einem bestimmten
Player
immer alles andere als eineBatter
? Wenn Sie können, dann ist es wahrscheinlich am besten, um die Verwendung der aggregation (in ähnlicher Weise, wie Sie jetzt tun).Wenn Sie aggregieren dann vielleicht mit einer anderen Klasse, um die Daten aufzunehmen. Sie könnten eine PlayerInfo Klasse oder Struktur und Aggregat:
Wenn Sie wirklich wollen, die erbschaft, die dann andere Antworten hier erzählen Sie, was Sie tun müssen - erstellen Sie eine Instanz der
Batter
auf und übergeben Sie dem Konstruktor Argumente, um einen Konstruktor der Klasse abgeleitet (z.B.Batter
) zu initialisieren.Denken Sie sorgfältig über das, was Sie auszudrücken versuchen in Ihrem code.
Dem Grund, die Sie haben wollen
Batter
abgeleitet vonPlayer
ist, wenn Sie virtuelle Funktionen inPlayer
implementiert werden, inBatter
und tun Sie etwas anders, je nachdem, ob oder nicht es ist einPlayer
oder eineBatter
.Nebenbei, seine besten zu halten Basisklassen abstrakte, wenn möglich, so
Player
würde nie direkt instanziert werden und würde immer abgeleitet werden müssen. Ich würde empfehlen, das Lesen von Scott Meyers " More effective C++', um zu verstehen, warum das so ist. Es gibt einen Abschnitt in der es gewidmet. In der Tat, einige der feineren Punkte des erbschaft-und OO-design im Allgemeinen sind schön erklärt.Was können Sie eigentlich wollen, ist etwas anders, je nachdem, wo Sie glauben, Ihr Modell zu ändern, und zusätzlich wo Sie Sie brauchen, um das dynamische Verhalten durch die Verwendung von virtuellen Funktionen?
Haben, könnten Sie einen
Player
Klasse, die alle Ihre player-spezifische details. Dann könnten Sie einePlayerBehaviour
Klasse, die, was der Spieler tut:So, Erben
Batter
ausPlayer
Modelle, die situation alsBatter
ist-einPlayer
.Mit einem
Behaviour
Modelle, die situation alsPlayer
hat-einBehaviour
wie einBatter
.Strukturen war, wie ich ursprünglich geplant die 'Spieler' - Klasse Verhalten.....aber durch die Jagd über online-der Allgemeine Rat zu sein schien: "du könntest auch eine Klasse", weil die privaten Bereiche werden sicherer....hmmm....möglicherweise müssen zurück gehen und sehen es jetzt....
Sie können es immer noch machen müssen getter - /setter-Funktionen und private Daten Mitglieder, wenn Sie möchten. Dies ist wichtig, wenn Sie versuchen, um auszudrücken, eine bestimmte invariante zwischen den Mitgliedern oder Einschränkungen auf, was Ihre Werte sein dürfen. Wenn es ist einfach eine Sammlung von unabhängigen Variablen einer struct ist in Ordnung.. Einige lieber getter/setter unabhängig.
Wenn Sie drehen sich um das Erbe, müssen Sie einen Grund haben zu müssen virtuelle Funktionen - was ist das Grund?
Ziemlich einfach: ein 'Spieler' kann ein 'Teig' und eine Anzahl der Teig-Funktionen erfordern gespeicherten Daten in der 'Spieler' (man Denke an die "Motor" Klasse eine variable für die "PS"....dann eine Klasse "Auto", die an einem Strang ziehen will der GetBHP () - Funktion von 'Motor', damit es berechnen kann, seine "TopSpeed" - und natürlich der "Motor" Klasse möglicherweise noch andere Funktionen, die nützlich sind, um in einem 'Auto'....Dann möchte ich in der Lage sein zu halten eine vorgefertigte engine in einem neuen Auto, anstatt zu erstellen, die den Motor bei der gleichen Zeit.)
InformationsquelleAutor Pete
Aufhören, die "Eltern" und "Kind" Terminologie, denken Sie an die "Basis" - Klassen und den "abgeleiteten" Klassen ... das ist das, was alle anderen Anrufe. "Eltern" und "Kind" kann verwendet werden, zu viele andere Möglichkeiten (z.B. ein Objekt besitzt ein anderes), so dass es verwirrend ist die Terminologie, wenn Sie reden über die Vererbung Beziehung.
Die abgeleitete Klasse enthält eine ganze Instanz des Basistyps in sich. Wenn der abgeleitete Konstruktor beginnt mit der Ausführung das erste, was Sie tut, ist zu konstruieren, die alle Ihre Basen, was es tut, durch den Aufruf Ihrer Konstruktoren. Also der abgeleiteten Klasse können Sie Steuern, wie die Basis aufgebaut ist, indem die richtigen Argumente:
Diese erstellt die
Base
undDerived
Objekte gleichzeitig (einer in den anderen) das ist wahrscheinlich das, was Sie wollen.Wenn Sie eine vorhandene
Base
Objekt und Sie möchten, dass die Basis Teil des abgeleiteten Objekts die gleiche wie die anderen, dann können Sie übergeben Sie ein Objekt zu kopieren:Dieser nicht den bestehenden
Base
Objektb
innerhalb derDerived
ein, sondern es macht das base-Objekt, das eine Kopie des Objektsb
durch Aufruf derBase
copy-Konstruktor, so jetzt gibt es zweiBase
Objekte, die originalb
- und das innerhalbd
. Dies ist näher an deinem ursprünglichen code, wo dieBatter
enthält einePlayer
Mitglied, aber jetzt ist es eine Basisklasse, die nicht Mitglied sind.Wenn Sie wollen, um die Vererbung verwenden, die erste form ist wohl besser geeignet, wo Sie gehen Argumente der abgeleiteten Klasse und Sie nutzt diese Argumente, die Basis zu schaffen.
"die neue Kopie von" Basis b " nur Sprünge und ersetzt den 'default' - Basis, die geschaffen wurde, sobald abgeleitet d() aufgerufen wurde?" Keine. Lesen Sie den code. Es gibt keine "Standard-Basis", die Basis-Klasse wird gebildet durch die
Base(name)
undBase(b)
Konstruktor aufrufen, bis diese Konstruktoren führen Sie die Basis nicht vorhanden ist, so gibt es nichts zu "ersetzen". Der Basis-name wird nie "nicht angegeben". Vor der Basis-Klasse erstellt seinen Namen gar nicht existiert, und im Konstruktor wird es gebaut, mit dem argumentnm
durch den Ausdruckname(nm)
, so nach, dass es "Abgeleitet Dave" oder "Barry Base"Es habe! Sorry, ich bin neu hier und es ist genau wie mein Französisch (ich bin passabel schreiben, aber ich kämpfen, es zu Lesen)....Ich habe totgeschlagen bis auf copy-Konstruktoren und jetzt ist es viel, viel klarer. Vielen Dank für die Hilfe!
InformationsquelleAutor Jonathan Wakely