Ü5 H1 c)

neoatlant
Mausschubser
Mausschubser
Beiträge: 58
Registriert: 14. Okt 2010 22:16

Ü5 H1 c)

Beitrag von neoatlant »

Hi,

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

IntType t;

t = 8;

Gruß

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Ü5 H1 c)

Beitrag 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.

neoatlant
Mausschubser
Mausschubser
Beiträge: 58
Registriert: 14. Okt 2010 22:16

Re: Ü5 H1 c)

Beitrag von neoatlant »

Danke für die schnelle Antwort, Alles klar !

Daki
Windoof-User
Windoof-User
Beiträge: 36
Registriert: 4. Nov 2010 14:34

Re: Ü5 H1 c)

Beitrag 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.
Nein, mein Nick hat nichts mit Kissen zu tun!

JohannesRudolph
Windoof-User
Windoof-User
Beiträge: 31
Registriert: 7. Nov 2010 01:42

Re: Ü5 H1 c)

Beitrag 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.

JohannesRudolph
Windoof-User
Windoof-User
Beiträge: 31
Registriert: 7. Nov 2010 01:42

Re: Ü5 H1 c)

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

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Ü5 H1 c)

Beitrag 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.

JohannesRudolph
Windoof-User
Windoof-User
Beiträge: 31
Registriert: 7. Nov 2010 01:42

Re: Ü5 H1 c)

Beitrag 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.

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Ü5 H1 c)

Beitrag 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.

kbraden
Mausschubser
Mausschubser
Beiträge: 98
Registriert: 15. Okt 2010 20:35

Re: Ü5 H1 c)

Beitrag 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?

dschneid
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 271
Registriert: 14. Dez 2009 00:56

Re: Ü5 H1 c)

Beitrag von dschneid »

Nein, das muss man manuell machen.

Antworten

Zurück zu „Archiv“