Ich arbeite an einer der Programmieraufgaben in dem Buch Starten von C ++ Early Objects 7th Edition und eine der Zuweisungen fragt, um eine Klasse zu erstellen, die von der STL-String-Klasse abgeleitet ist. Ich veröffentliche die Frage, um zu verstehen, was ich tun darf und wie ich die Lösung implementieren soll, so dass niemand erweiterte Vorschläge unterbreitet.
- Frage so wie sie im Text steht -
Palindrom-Test
Ein Palindrom ist eine Zeichenfolge, die dasselbe rückwärts wie vorwärts liest. Zum Beispiel sind die Wörter Mama, Vater , Frau und Radar Palindrome. Schreibe eine class Pstring
, die von STL string class
abgeleitet ist. Das Pstring class
fügt eine Memberfunktion hinzu
bestimmt, ob die Zeichenfolge ein Palindrom ist. Fügen Sie einen Konstruktor hinzu, der ein STL string
-Objekt als Parameter akzeptiert und an den String-Basisklassenkonstruktor übergibt. Testen Sie Ihre Klasse mit einem Hauptprogramm, das den Benutzer auffordert, eine Zeichenfolge einzugeben. Das Programm verwendet die Zeichenfolge, um ein Pstring-Objekt zu initialisieren, und ruft dann isPalindrome () auf, um zu bestimmen, ob die eingegebene Zeichenfolge ein Palindrom ist.
Es kann nützlich sein, den Subscript-Operator [] der String-Klasse zu verwenden: Wenn str ein String-Objekt ist und k eine Ganzzahl ist, gibt str [k] den Charakter an der Position k in der Zeichenkette zurück. p>
- Ende -
Meine Hauptfrage ist, wie kann ich auf die Member-Variable zugreifen, die mein String-Objekt enthält, wenn die Klasse, von der ich Pstring ableite, eine Klasse ist, die ich nicht geschrieben habe, und ich weiß nicht, wie sie ihre Member implementiert?
Zum Beispiel
%Vor%Der Grund, warum ich das falsch mache, ist, weil die Zuweisung die tiefgestellte Notation erwähnt, ich aber nicht verstehe, wie man die tiefgestellte Notation benutzt, wenn ich den Namen der Variablen, wo die Zeichenkette ist, nicht kenne gespeichert.
Jede Hilfe würde sehr geschätzt werden, weil der Autor die Lösungen nicht anbietet, es sei denn, ich bin ein Lehrer, der meiner Meinung nach ziemlich lahm ist. Es hat wahrscheinlich damit zu tun, dass es sich um einen akademischen Text handelt.
Sie sollten nicht von std :: string erben, da es nicht dafür entworfen wurde, oder Sie brauchen es, um ein Palindrom zu finden.
Siehe hierzu: Vererben und Überschreiben von Funktionen eines std :: string?
Palindrome Lösung (aus dieser Frage: Überprüfen Sie, ob eine Zeichenfolge palindrome ist Verknüpfung von dies: C ++ Palindrome-Finder-Optimierung )
%Vor%Die Qualität dieses Buches scheint fragwürdig. Freie Funktionen (je nachdem, wen Sie fragen) werden fast immer über Mitgliedsfunktionen bevorzugt und besonders bevorzugt gegenüber Vererbung.
Wenn Sie Vererbung verwenden müssen:
%Vor% Das Buch deckt auto
nicht ab, da das Keyword erst kürzlich zur Sprache hinzugefügt wurde. Wenn Ihr Compiler über ein Jahr alt ist oder nicht einer der großen Namen, wird er wahrscheinlich nicht unterstützt.
Für dieses Problem müssen Sie auf keine Mitgliedsvariablen für eine ordnungsgemäße Lösung zugreifen, so dass Sie sich keine Gedanken darüber machen müssen, was sie sind oder ob sie erreichbar sind. Gute Sache, weil nichts davon durch den Standard spezifiziert ist - es sind alle Implementierungsdetails, die von Ihrem speziellen Compiler definiert werden, und wenn Sie herausfinden, dass Sie so tief graben, sollten Sie sich fragen, was Sie falsch machen.
Natürlich werden die Memberfunktionen der Elternklasse genau wie die Memberfunktionen der Kindklasse aufgerufen - Sie rufen sie einfach auf.
Die Überlastungen der Benutzer sind etwas kniffliger, aber immer noch nicht so schlecht. Sie müssen die Instanz angeben, für die sie aufgerufen werden sollen. Dies ist *this
. Sie können sie auch mit dem Schlüsselwort operator
aufrufen, aber meiner Meinung nach ist das etwas unhandlicher.
Wenn Sie auto nicht verwenden möchten, können Sie stattdessen einfach std::string::iterator
verwenden, was auto
in diesem Fall auf jeden Fall löst.
Damit ist das Problem # 1 erfüllt.
Wenn Sie begin()
und end()
aufrufen, rufen Sie die Mitglieder begin()
und end()
in der Oberklasse std :: string auf.
Somit ist das Problem # 2 erfüllt.