C++ Datentypen zur Laufzeit unterscheiden

dapcfreek

Lieutenant
Registriert
Okt. 2008
Beiträge
813
Hallo,
also, ich bin gerade dabei mir C++ anzueignen und stehe bei einem Programm vor einem Problem.

Also, ich habe einer Oberklasse und zwei vererbte Klassen. Der unterschied zwischen den zwei vererbten klassen ist nur eine Variable. Einmal liegt der Typ float drin und einmal der Typ int.

Jetzt muss ich bei einer Funktion rausfinden, welcher der beiden Typen (also welche Unterklasse) es ist. Denn ich darf die Funktion nur bei einer Unterklasse anwenden. Bloß ich weiß einfach nicht, wie ich das anstellen soll. Gibt es einen befehl, mit dem ich den Datentyp festlegen kann?

Hoffe, ihr habt mein Problem verstanden. Und ich hoffe auf eine gute Antwort.

danke schon mal.
 
Was soll damit gemacht werden? Normalerweise kümmern sich Methoden um die Abarbeitung und die Klasse/das Objekt an sich um die Datenverarbeitung.
 
eine lösung, die das liefert: eine funktion der oberklasse, die standardmäßig 0 zurückgibt.

die unterklasse, auf die diese operation angewandt werden soll, überschreibt diese funktion und gibt 1 zurück.

allerdings stimme ich yuuri zu, dass zugriffe auf membervariablen sowieso eigentlich nur innerhalb der klasse selbst geschehen sollten..
 
wahrscheinlich, aber wenn er nicht von alleine auf die von mir angegebene lösung gekommen ist, werden ihn doch atm wohl templates überfordern, oder?
 
Versuch mit typeid oder dynamic_cast. Typeid erlaubt es dir die Klassen zu unterscheiden und mit dynamic_cast kannst du sie ineinander umwandeln.

Oder es wie maxwell machen und eine eigene "ID" zur Unterscheidung anlegen.

Grundsätzlich ist es am besten die ganze Zeit zu wissen, was für ein Objekt du grade hast. Situationen in denen du typeid oder dynamic_cast brauchst, solltest du vermeiden.
http://en.wikibooks.org/wiki/C++_Programming/RTTI#Misuses_of_RTTI
 
Zuletzt bearbeitet:
Wirklich helfen kann man dir nur, wenn du dein Problem etwas genauer beschreibst, aber meine Vermutung ist, daß du etwas in dieser Art suchst:

Code:
class Base
{
protected:
	Base() {}

public:
	void doSomethingUseful() const
	{
		// virtueller Aufruf ... was konkret gemacht wird, hängt vom Typ der Klasse ab
		doSomethingUseful_impl();
	}
	
	virtual ~Base() {}

private:
	// abstrakt in der Basisklasse ... Implementierung muß in abgeleiteter Klasse erfolgen
	virtual void doSomethingUseful_impl() const = 0;
};

class Derived_withFloat : public Base
{
public:
	Derived_withFloat() : m_floatMember( 0.0 ) {}

private:
	float m_floatMember;

	virtual void doSomethingUseful_impl() const
	{
		std::cout << "Float member = " << m_floatMember << "\n";
	}
};

class Derived_withInt : public Base
{
public:
	Derived_withInt() : m_intMember( 0 ) {}

private:
	int m_intMember;

	virtual void doSomethingUseful_impl() const
	{
		std::cout << "Int member = " << m_intMember << "\n";
	}
};
 
Danke leute, habs jetzt hinbekommen. Habe ale vorschläge hier getestet, um das mal zu checken, hat perfekt funktioniert.
 
Ich hoffe mal schwer, du hast dich nicht für die dynamic_cast / typeid Variante entschieden ...
 
Nein, ich habe mich auf die möglihkeit von maxwell-cs entschieden
 
Wenn du Subklassen hast, sollten die sich auch haargenau so verhalten, nach außen hin also auch die gleichen Datentypen zurückgeben. Wenn sie das nicht tun, hat dein OOP-Modell schon an sich arge Probleme.
 
antred schrieb:
Ich hoffe mal schwer, du hast dich nicht für die dynamic_cast / typeid Variante entschieden ...
:D Was wäre deine präferierte Variante gewesen? Ich hatte ja geschrieben, dass RTTI zu vermeiden ist und benutze es auch nie, obwohl C++ diese Möglichkeiten bietet und sie nicht unerwähnt bleiben sollten. ^^
 
Wenn zur Laufzeit je nach Typ der Klasse unterschiedliches Verhalten gewünscht wird, sind eigentlich immer virtuelle Methoden der richtige Weg; wie ich oben bereits angedeutet habe.

Allerdings war die Problembeschreibung des OP viel zu ungenau, als daß man mit Sicherheit sagen könnte, ob dieser Laufzeit-Polymorphismus in seinem Fall überhaupt benötigt wird.
 
Zurück
Oben