Ü5 H1 c)
Re: Ü5 H1 c)
Wenn es ein primitiver Typ (int, etc.) ist auf jeden Fall. Wenn es kein primitiver Typ ist, ueberschreibt er wahrscheinlich den = Operator, also geht das auch. Ansonsten kannst du auch einen Konstruktor benutzen: IntType t(8); Das geht auch mit primitiven Typen.
Re: Ü5 H1 c)
Danke für die schnelle Antwort, Alles klar !
Re: Ü5 H1 c)
Das funktioniert aber wieder nur, wenn es auch einen Konstruktor gibt, der genau einen int-Wert (oder was zu diesem Literal kompatibel ist) entgegennimmt. Wenn es z.B. nur einen Konstruktor mit genau zwei Parametern gibt … wird's schwierig. ;-)mw1039 hat geschrieben:Ansonsten kannst du auch einen Konstruktor benutzen: IntType t(8);
Mich würde ebenfalls eine Lösung dazu interessieren.
Nein, mein Nick hat nichts mit Kissen zu tun!
-
- Windoof-User
- Beiträge: 31
- Registriert: 7. Nov 2010 01:42
Re: Ü5 H1 c)
Also wenn man sich es mal genau überlegt, kann die Aufgabe mit einem Type der nur den + Operator überlädt wohl kaum funktionieren.
Als Beispiel kann man zum Beispiel mal folgenden verwenden:
Irgendwie muss man diesem Typen den Wert einer einzelnen Stelle zuordnen. Nehmen wir der Einfachheit halber mal an wir können den Wert einer Stelle als long darstellen. Dann brauche ich in jedem Falle einen operator+(const unsigned long rhs), oder aber einen implicit cast operator von long nach MyIntType, um die Werte der Stellen aufzuaddieren. Ein weiteres Problem ist die Initialisierung. Irgendwie müssen wir sicherstellen, das wir den IntType mit 0 initilaisiern können. Dazu könnten wir zum Beispiel einen Konstruktor mit der Signatur IntType(long x) vorraussetzen. Alle primitiven Datentypen haben einen solchen CopyConstructor.
Als Beispiel kann man zum Beispiel mal folgenden verwenden:
Code: Alles auswählen
class MyIntType
{
public:
long value;
const MyIntType MyIntType::operator+(const MyIntType &rhs) const
{
MyIntType result = *this; // Make a copy of myself. Same as MyClass result(*this);
result.value += rhs.value;
return result;
}
};
-
- Windoof-User
- Beiträge: 31
- Registriert: 7. Nov 2010 01:42
Re: Ü5 H1 c)
An die Veranstalter: Ist eine Lösung, die folgende minimale Signatur der template Typ-Parameter akzeptiert in Ordnung?
Code: Alles auswählen
class MyIntType
{
public:
long value;
const MyIntType MyIntType::operator+(const MyIntType &rhs) const
{
MyIntType result = *this; // Make a copy of myself. Same as MyClass result(*this);
result.value += rhs.value;
return result;
}
const MyIntType MyIntType::operator+(const long rhs) const
{
MyIntType result = *this; // Make a copy of myself. Same as MyClass result(*this);
result.value += rhs;
return result;
}
MyIntType(long pValue)
{
value = pValue;
}
};
int main()
{
cout << myAtoi_withTemplates<long>("1234") << endl;
cout << myAtoi_withTemplates<long>("0x12AB") << endl;
cout << myAtoi_withTemplates<long>("0o1267") << endl;
cout << myAtoi_withTemplates<long>("0b1100101") << endl;
cout << endl << endl;
cout << myAtoi_withTemplates<MyIntType>("1234").value << endl;
cout << myAtoi_withTemplates<MyIntType>("0x12AB").value << endl;
cout << myAtoi_withTemplates<MyIntType>("0o1267").value << endl;
cout << myAtoi_withTemplates<MyIntType>("0b1100101").value << endl;
int i;
cin >> i;
}
Re: Ü5 H1 c)
Also ich hab deinen Code jetzt nicht getestet, aber das ist ok. Ihr koennt davon ausgehen, dass entweder ein Konstruktor, der einen int nimmt, definiert ist, oder dass der = Operator ueberschrieben wird.
Fuer die Loesung braucht ihr den IntType eigentlich nicht selbst implementieren. Ihr koennt aber als Testcases gerne die verschiedenen integralen Typen (z.B. char (wenn das Ergebnis denn da rein passt), int, long long int, unsigned long long int, ...) verwenden.
Fuer die Loesung braucht ihr den IntType eigentlich nicht selbst implementieren. Ihr koennt aber als Testcases gerne die verschiedenen integralen Typen (z.B. char (wenn das Ergebnis denn da rein passt), int, long long int, unsigned long long int, ...) verwenden.
-
- Windoof-User
- Beiträge: 31
- Registriert: 7. Nov 2010 01:42
Re: Ü5 H1 c)
Ja wenn das so gemeint ist: Alle integralen typen, dann ist die Aufgabe ja gut lösbar. Allerdings ist ein Template eben ein Template, und wenn da steht wir können nur vom operator+ ausgehen heißt das für mich glasklar dass jeder Typ als Typparameter unterstützt werden können muss, der nur den operator+ überlädt....
Das wäre dann ziemlich schwierig. Das korrekte schreiben von wirklich generischen C++ Templates ist eben auch nicht einfach...
Wen interessiert wie man das "richtig" macht, dem sei ans Herz gelegt mal nach C++ Traits und Template-Spezialisierung zu googlen.
Das wäre dann ziemlich schwierig. Das korrekte schreiben von wirklich generischen C++ Templates ist eben auch nicht einfach...
Wen interessiert wie man das "richtig" macht, dem sei ans Herz gelegt mal nach C++ Traits und Template-Spezialisierung zu googlen.
Re: Ü5 H1 c)
Ich wiederhole gerne nochmal:JohannesRudolph hat geschrieben:und wenn da steht wir können nur vom operator+ ausgehen
Es darf also nicht nur vom + operator ausgegangen werden.mw1039 hat geschrieben:Ihr koennt davon ausgehen, dass entweder ein Konstruktor, der einen int nimmt, definiert ist, oder dass der = Operator ueberschrieben wird.
Re: Ü5 H1 c)
Wo wir grade dabei sind, hat jetzt nicht direkt mit der Aufgabe zu tun:
Wenn ich in einer Klasse sowohl + als auch = ueberlade, muss ich dann manuell += ueberladen damit es wie x = x + y funktioniert, oder passiert das automatisch?
Edit: grade nochmal drueber nachgedacht, evtl. reichts sogar nur + zu ueberladen?
Wenn ich in einer Klasse sowohl + als auch = ueberlade, muss ich dann manuell += ueberladen damit es wie x = x + y funktioniert, oder passiert das automatisch?
Edit: grade nochmal drueber nachgedacht, evtl. reichts sogar nur + zu ueberladen?
Re: Ü5 H1 c)
Nein, das muss man manuell machen.