Design Problem
-
.. obige Fehlermeldung erhalte ich, wenn ich ein Objekt vom Typ AlgoInt in einer anderen Klasse (Header included) deklariere und auf diesem Objekt die Methode calc aufrufe.
-
Versuch das mal mit einem anderen Compiler, z.B. dem Comeau Online.
-
g++ 4.3.0 schluckt das ohne Probleme. Wie benutzt du es denn?
-
ich habe jetzt
algo.h: template <typename T> class Algo { public: void calc() { Step2(T()); } protected: virtual ~Algo(){} virtual void Step2(T)=0; }algoint.h: class AlgoInt : public Algo<int> { virtual void Step2(int); };algoint.cpp: class AlgoInt : public Algo<int> { virtual void Step2(int); { std::cout << "Step2 - int" << std::endl; } };test.cpp: AlgoInt a; a.calc();
-
Wozu soll jetzt diese algoint.cpp gut sein?
Packe den gesamten Code in die algoint.h, dann soltte es auch gehen.
-
und als Fehlermeldung:
zu:
Step2(T());Elementfunktion kann nicht ohne Objekt aufgerufen werdenzu test.cpp:
Variable »a« kann nicht als vom abstrakten Typ »AgloInt« deklariert werden
-
naja ich implmentiere halt noch einige weitere Funktionen und möchte da eine saubere Trennung.
-
Nein, das spielt kein Rolle.
algoint.cpp: class AlgoInt : public Algo<int> { virtual void Step2(int); // <- Deshalb ist die abstrakte Methode nicht definiert { std::cout << "Step2 - int" << std::endl; } };
-
das ist bei mir nicht drin, das Komma!
... das kann es also nicht sein!
-
Verrücktwerd .. schrieb:
algoint.cpp: class AlgoInt : public Algo<int> { virtual void Step2(int); { std::cout << "Step2 - int" << std::endl; } };
-
ja das war ein copy & paste Fehler.
Bei der Klasse AgloInt zeigt er mir noch den Fehler:
denn die folgenden virtuellen Funktionen sind rein innerhalb »AgloInt«:
-
ach hoppla, den code vorhin muss ich ja mit zwei geschlossenen augen angesehen haben. da ist ziemlich vieles falsch!
-
ahha und was sonst noch?
-
Irgendwie hab ich den Eindruck, du kommst mit der Trennung Header/Source nicht zurecht...
//algoInt.h #include "Algo.h" class AlgoInt : public Algo<int> { virtual void Step2(int); // <- Deklaration }; //algoInt.cpp #include "algoInt.h" void AlgoInt::Step2(int) //<- Definition { std::cout << "Step2 - int" << std::endl; }
-
Fehlendes Semikolon, Redefinition von AlgoInt. Ansonsten sollte der Code wohl kompilieren.
-
@Aquae: ja aber genau so habe ich es!
-
Wirklich?
Dein Code vorhin sah aber nicht so aus.
-
das ist jetzt mal der code wie ich ihn verwende:
algo.h template< typename input, typename list, typename output> class Algo { public: /* Constructor */ Algo(); static void calc( input &in, list &lis, output &out) { ... Step2( input(), matrix(), output()); ... Step3( m, list(), output()) ... } protected: /* Destructor */ virtual ~Algo(); virtual void Step2( input, list, output)=0; virtual void Step3( int &m, list, output)=0; private: };
-
algoInt.h: class AggloClusterMeasurement3D : public AlgoInt< int, int, int> { public: /* Constructor */ AlgoInt(); /* Destructor */ virtual ~AlgoInt(); private: virtual void Step2( input, list, output); virtual void Step3( int &m, list, output); };
-
algoint.cpp: void Step2( input, list, output) { .. } void Step3( int &m, list, output) { .. }sodele