Seite 1 von 1

Ü5 H1 c)

Verfasst: 24. Nov 2011 10:14
von neoatlant
Hi,

Kann man dem IntType Werte zuweisen, falls ja, wie ? wäre das z.B zulässig

IntType t;

t = 8;

Gruß

Re: Ü5 H1 c)

Verfasst: 24. Nov 2011 10:22
von mw1039
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)

Verfasst: 24. Nov 2011 11:45
von neoatlant
Danke für die schnelle Antwort, Alles klar !

Re: Ü5 H1 c)

Verfasst: 24. Nov 2011 22:03
von Daki
mw1039 hat geschrieben:Ansonsten kannst du auch einen Konstruktor benutzen: IntType t(8);
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. ;-)

Mich würde ebenfalls eine Lösung dazu interessieren.

Re: Ü5 H1 c)

Verfasst: 25. Nov 2011 10:32
von JohannesRudolph
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:

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;						
	  }
};
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.

Re: Ü5 H1 c)

Verfasst: 25. Nov 2011 10:46
von JohannesRudolph
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)

Verfasst: 25. Nov 2011 13:29
von mw1039
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.

Re: Ü5 H1 c)

Verfasst: 25. Nov 2011 16:09
von JohannesRudolph
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.

Re: Ü5 H1 c)

Verfasst: 25. Nov 2011 16:48
von mw1039
JohannesRudolph hat geschrieben:und wenn da steht wir können nur vom operator+ ausgehen
Ich wiederhole gerne nochmal:
mw1039 hat geschrieben:Ihr koennt davon ausgehen, dass entweder ein Konstruktor, der einen int nimmt, definiert ist, oder dass der = Operator ueberschrieben wird.
Es darf also nicht nur vom + operator ausgegangen werden.

Re: Ü5 H1 c)

Verfasst: 27. Nov 2011 17:17
von kbraden
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?

Re: Ü5 H1 c)

Verfasst: 27. Nov 2011 17:55
von dschneid
Nein, das muss man manuell machen.