Unbekannter Rückgabewert in Interface-Klasse
-
Wie kann man bei einer abstrakten Interface-Klasse den Rückgabewert einer Methode definieren, der erst in der abgeleiteten Klasse bekannt ist?
Beispiel:
class Interface { public: virtual UnknownType* getInternalType() = 0; } class A : public Interface { private: B *internal_type_; public: virtual B* getInternalType() }Bei diesem Beispiel kommt eine Fehlermeldung vom Compiler:
overriding virtual function return type differs and is not covariant from 'Interface::getInternalType'Danke für Hinweise!
Gruß,
Lemmy
-
Hallo
Ich habe keine genaue Ahnugn, aber tippe mal, das so etwas entweder mit den verpönnten void-eigern oder mit templates geht.
chrische
-
Ich fürchte Templates helfen mir hier nicht wirklich weiter.
Gibt es vl. noch eine andere Möglichkeit?
-
Wie wärs, wenn alle Rückgabetypen(klassen?) von einer Basisklasse ableiten?
-
Sinn?
Was willst du mit dem Interface erreichen, wenn man wissen muss, welche Abgeleitete Klasse da instantiirt ist?
Der Sinn von polymorphismus/interfaces ist doch, dass du die Interfaces benutzen kannst ohne die genaue Klasse zu kennen, die da instantiiert ist ...
Warum gehen keine Templates?
-
Das ist wahrscheinlich nur mein Problem, aber was ist an deinem Typen "Internal", wenn du einen öffentlichen Zugriff darauf erlaubst?
-
PyradmieAusÄgypten schrieb:
Wie wärs, wenn alle Rückgabetypen(klassen?) von einer Basisklasse ableiten?
Das will ich eigentlich vermeiden, weil die Rückgabetypen aus einer Lib kommen.
darthdespotism schrieb:
Sinn?
[...]
Warum gehen keine Templates?Bei einem Template muss ich ja den genauen Typ angeben oder?
-
camper schrieb:
Das ist wahrscheinlich nur mein Problem, aber was ist an deinem Typen "Internal", wenn du einen öffentlichen Zugriff darauf erlaubst?
Der interne Typ ist der Datentyp, den die externen Lib-Funktionen benötigen.
-
Lemmy schrieb:
camper schrieb:
Das ist wahrscheinlich nur mein Problem, aber was ist an deinem Typen "Internal", wenn du einen öffentlichen Zugriff darauf erlaubst?
Der interne Typ ist der Datentyp, den die externen Lib-Funktionen benötigen.
Könntest du ein Beispiel geben, wie das benutzt werden soll?
-
camper schrieb:
Könntest du ein Beispiel geben, wie das benutzt werden soll?
class Matrix { public: virtual UnknownMatrixType* getInternalType() = 0; } class LaMatrix : public Matrix { private: LaGenMatDouble *internal_type_; public: virtual LaGenMatDouble* getInternalType() } class LaVector : public Matrix { private: LaVectorDouble *internal_type_; public: virtual LaVectorDouble* getInternalType() }LaGenMatDouble und LaVectorDouble sind Lib-Klassen.
Und dann gibt es zB irgendwo folgende Methode:
void getMultiplication(Matrix& A, Matrix& B) { libFunction(A->getInternalType, B->getInternalType); }Und je nachdem, ob es sich um einen Vektor oder eine Matrix handelt, sollte auch der interne Typ an libFunction übergeben werden.
-
Dann brauchst du Kovarianz gar nicht. Gibt einfach in allen Klassen ein UnknownType* zurück.
-
camper schrieb:
Dann brauchst du Kovarianz gar nicht. Gibt einfach in allen Klassen ein UnknownType* zurück.
Hm. UnknownType* hab i da jetzt nur so hingeschrieben, weil ich nicht weiß, was ich da als return-Wert zurückliefern soll. Also genau hier liegt mein Problem. Also die Klasse *UnknownType gibts gar nicht. Und irgendwas muss ich aber in der Basisklasse auch als Return-Wert zurückgeben, nur was?!
-
UnknownType* ist ja nichts weiter als der Typ von
A->getInternalType() bzw. B->getInternalType() inlibFunction(A->getInternalType(), B->getInternalType());und richtet sich demzufolge nach dem Typen, den die Funktion verlangt.
-
camper schrieb:
UnknownType* ist ja nichts weiter als der Typ von
A->getInternalType() bzw. B->getInternalType() inlibFunction(A->getInternalType(), B->getInternalType());und richtet sich demzufolge nach dem Typen, den die Funktion verlangt.
Ja, aber hier kann sowohl
- LaVectorDouble
- LaGenMatDouble
an die Lib-Funktion übergeben werden, d.h. ich hab 2 verschiedene Typen, wo ich aber nicht vorher nicht weiß, welcher wirklich daher kommt. Das sollte dann dynamisch eingesetzt werden.