Operator, Typ erst später definieren
-
Hi!
Ich habe eine Frage zur Vererbung bei Operatoren. Ich habe eine abstrakte Klasse, die einen von mir definierten Operator hat. Den Rückgabetyp des Operators soll erst in den abgeleiteten Klassen definiert werden, da er unterschiedlich sein kann. Wie kann ich das in C++ realisieren?
Gruß,
miho
-
Der Rückgabetyp muss vorher schon feststehen.
Allerdings kannst du mit kovarianten Rückgabewerten arbeiten, falls du das willst.
D.h. in der Basisklasse wird ein Base* zurückgegeben und in der abgeleiteten Klasse ein Derived*.So richtig toll klingt aber aber vom Design nicht. Wenn du willst, erzähl doch mal ein bisschen mehr, was du vorhast.
-
Danke für die schnelle Antwort!
Ich habe einen genetischen Algorithmus geschrieben. Dabei werden Vektoren vom Typ double verarbeitet. Das ganze ist so geschrieben, dass sich ganz unterschiedliche Probleme lösen lasse. Es gibt eine abstrakte Klasse, von der man dann die problemspezifische Klasse ableiten kann. Dabei muss man nur eine Methode implementieren, die dann den Einheiten die Fitness zuordnet. Das klappt soweit ganz gut. Nur ist der Typ der Vektoren (Chromosomen) leider festgelegt und ich würde das Ganze gerne verallgemeinern.
-
Dann würde ich die Klasse die Deine Chromosomen beinhaltet auch zu einem template machen. Mit dem Typ der verktoren als templateparameter.
-
Jetzt habe ich da noch ne Frage zu Templates:
Ich kriege immer einen "undefined reference" - error, wenn ich folgenden code compiliere:
bla1.h
template <typename T> class a1 { public : T output( T bla ); }; class aint1 : public a1<int> {};bla1.cpp
template <typename T> T a1<T>::output( T bla ) { return bla; }main.cpp
#include <iostream> #include "bla1.h" using namespace std; int main( int argc, char *argv[] ) { aint1 obj; cout << obj.output( 10 ) << endl; return 0; }Schreibe ich alles in eine Datei, dann gibt es keine Fehler:
main.cpp
#include <iostream> using namespace std; template <typename T> class a1 { public : T output( T bla ); }; class aint1 : public a1<int> {}; template <typename T> T a1<T>::output( T bla ) { return bla; } int main( int argc, char *argv[] ) { aint1 obj; cout << obj.output( 10 ) << endl; return 0; }Was mache ich falsch?
-
Hallo,
Schau mal in die FAQ
-
Danke!
Gruß,
miho
-
Den Algorithmus gibt's übrigens auf meiner Seite (gensolver): www.mihosoft.de
Danke nochmal für eure Hilfe!