Ich habe eine Zuordnung, wo ich "Erstellen Sie eine Klasse namens Number, die von String abgeleitet ist. Sie werden dies als Basisklasse verwenden, um Ihre Integer und Double-Klassen abzuleiten." Es wird weiter gesagt, dass der Datenabschnitt aus den Integer- und Double-Klassen "weggehen" wird.Klasse abgeleitet von Zeichenfolge als Datenabschnitt verwendet
"Da die Zahl von String abgeleitet ist und Integer und Double von Number abgeleitet sind, werden sie alle zu Strings. Dies gibt Ihnen einen integrierten Datenabschnitt." Was ich nicht verstehe, ist, wo mein Datenbereich jetzt ist. Wie rufe ich es an und ändere es.
„An diesem Punkt Ihre Nummer Klasse wird nur den folgenden Code enthalten:
-A kein Argument Konstruktor, der den Datenabschnitt setzt auf‚0‘
-Eine überladenen Konstruktor, der einen String und setzt nimmt Der Datenabschnitt wird an den Wert übergeben. "
//Number class with the two constructors
#ifndef NUMBER
#define NUMBER
#include <iostream>
#include <string>
using namespace std;
class Number: public string
{
public:
Number() : string("0") { }
Number(string s) : string(s) { }
};
#endif
Doppel Klasse
//Double class
#ifndef DOUBLE
#define DOUBLE
#include <string>
#include "Integer.h"
#include "Number.h"
using std::string;
class Double: public Number
{
private:
// do i call Number here? like Number data; or double data;?
// or is the data not here?
void isNan(string s);
bool nan = false;
void recursiveNaN(string::iterator p, string::iterator n);
public:
// Constructors
Double();
Double(double d);
Double(const Double &d);
Double(const Integer &i);
// Functionality
void equals(double d);
Double &equals(const Double &d);
Double add(const Double &d);
Double sub(const Double &d);
Double mul(const Double &d);
Double div(const Double &d);
double toDouble() const;
//Primitives
Double add(double d);
Double sub(double d);
Double mul(double d);
Double div(double d);
// Operator Overload
Double operator + (const Double &d);
Double operator - (const Double &d);
Double operator * (const Double &d);
Double operator/(const Double &d);
Double &operator = (const Double &d);
bool operator == (const Double &d);
bool operator == (double d);
bool operator != (const Double &d);
bool operator != (double d);
//String stuff
Double(string s);
bool isNan();
void equals(string s);
Double &operator = (string s);
string toString();
};
#endif // !DOUBLE
Einer unserer Hinweise war auf die Leere quals (double d) Funktion. Der Hinweis war, das d in eine Zeichenkette umzuwandeln und dann das Gleichheitszeichen mit überladenem Zeichenfolgenargument aufzurufen, um dies-> zuzuweisen.
void Double::equals(double d)
{
stringstream ss;
ss << d;
this->equals(ss);
}
void Double::equals(string s)
{
this->isNan(s);
if (!this->isNan())
this->assign(s);
else
this->assign("0.0");
}
In meinem Kopf würde das sein, was er meinte, aber das gibt mir und Fehler, dass es keine Member-Funktion, die nur zu equals.I Anrufen müssen wissen, wie diese neuen Daten zu nennen, und wie es zu ändern. Meine Nummer-Klasse kann auch keine Funktionen mehr haben.
Sie sollten beachten, dass C++ - Standardbibliotheksklassen im Allgemeinen nicht gut geeignet sind, um sie zu erben, z. mit 'std :: string' gibt es keine' virtuellen' Funktionen, die man überschreiben kann, also ist das Erben etwas sinnlos. Es ist wahrscheinlich besser, nur eine interne 'std :: string' Membervariable zu verwenden. –
Wer würde sogar eine Zahlenklasse von einer String-Klasse ableiten ?? – zett42
Ja ich weiß nicht, wie praktisch abgeleitet von String ist, aber es ist für die Zuordnung erforderlich. – dnun99