virtual
-
Hey,
ich überschreibe gerade den Operator == in Vektor.
Ich habe 4 Klassen.1. Klasse Vector.h
2. Klasse Vector.inl
3. Klasse Vector3.h
4. Klasse Vector3.inlin Vector.h hab ich den Operator überschrieben.
Vector ruft man mit Vector<T,dim> (Template, Diminesion)
es gibt eine schablone in Vector3.h
das man auch Vector3<T> aufrufen kann.allerdings wenn ich Vector3<T>==Vector3<T> mach sagt er er kennt das nicht.
=> ich muss virtual in Vector3.h einbauen.
ich hab alledings keine Ahnung davon.deshalb frag ich euch wo mein Fehler ist:
Mein Versuch.Vector3.h:
inline virtual bool operator==(const Vector<T, 3> &v);Vector3.inl:
template<typename T>
bool Vector3<T>::operator==(const Vector3<T> & mV)
{
return bool::Vector<T,3>==(const Vector<T,3> & mV);
}Fehler:
error C2244: 'common::vecmath::Vector3<T>::operator ==': Keine Übereinstimmung für Funktionsdefinition mit vorhandener Deklaration gefunden c:\daten\vector3.inl
-
Mal abgesehen von dem Compilerfehler und das Fehlen von Code-Tags: Das Mischen von
virtualundtemplatesuggeriert, dass dein Ansatz eher schlecht ist. Auch dasinlinevorvirtualmacht mich stutzig. Ansonsten passen die Signaturen nicht,Vector3<T>ist ein anderer Typ alsVector<T,3>.bool operator==(const Vector<T, 3> &v); bool operator==(const Vector3<T> & mV);Und keine Ahnung was du damit meinst:
es gibt eine schablone in Vector3.h
das man auch Vector3<T> aufrufen kann.
-
knivil schrieb:
Mal abgesehen von dem Compilerfehler und das Fehlen von Code-Tags: Das Mischen von
virtualundtemplatesuggeriert, dass dein Ansatz eher schlecht ist. Auch dasinlinevorvirtualmacht mich stutzig. Ansonsten passen die Signaturen nicht,Vector3<T>ist ein anderer Typ alsVector<T,3>.bool operator==(const Vector<T, 3> &v); bool operator==(const Vector3<T> & mV);Und keine Ahnung was du damit meinst:
es gibt eine schablone in Vector3.h
das man auch Vector3<T> aufrufen kann.damit mein ich genau das was du bemängelt hast.
das beide aufrufe gehen sollen. wenn ich 2 Vectoren mit dim = 3 habe dann soll man auch Vector3<T> schreiben können und nicht unbedengt Vector<T,dim>.
-
Ich verstehe nicht ganz wo dein Problem ist (und vor allem wie und wo da virtual rein passt). Poste doch mal deinen Code und sag in welcher Zeile der Compiler meckert.
-
Vector.inl:
template<typename T, unsigned int dim>template<const unsigned int dim2> bool Vector<T,dim>::operator==(const Vector<T,dim2> & mV) { }Vector.h:
template<const unsigned int dim2> inline virtual bool operator== (const Vector<T, dim2> &mV);Vector3.h:
template<typename T> bool Vector3<T>::operator==(const Vector3<T> & mV) { return Vector<T,3>::operator==(const Vector<T,3> & mV); }Vector3.inl:
template<typename T, unsigned int dim> class Vector; template<typename T> class Vector3 : public Vector<T, 3> { public: //construction Vector3(); Vector3(T e1, T e2, T e3); virtual ~Vector3(){} ... inline virtual bool operator==(const Vector<T, 3> &mV);was ist an dem virtual falsch? wie müsste man des machen das es funktioniert?
-
Ich blicke da zwar immer noch nicht mehr durch als vorher, aber ist dir klar, dass du den operator == einfach vererben kannst? Da ändert sich doch überhaupt nichts?
class A { public: bool operator == (const A &a) const { return true; } }; class B : public A { }; int main() { B b1, b2; if (b1 == b2) std::cout << "yaay!"; }
-
Ich will ja das virtual verstehen...
ist meine Frage echt so unverständlich... des ist doof.
Also Vector erbt von Vector3.
wenn ich machen würdeif(Vector<T,3>==Vector<T,3>)dann würde es gehen aber ich will über virtual erreichen das Vector3 dann Vector aufruft und ich somit auch
if(Vector3<T>==Vector3<T>)aufrufen kann.
-
82kolu schrieb:
Ich will ja das virtual verstehen...
Wenn das dein Hauptziel ist, ist deine Frage doof, weil virtual eine völlig andere Funktion hat als die, nach der du hier fragst. Denn das kannst du auch mit normaler Vererbung erreichen. (Und das solltest du auch tun.)
virtual wird eben gerade dann spannend, wenn sich das Verhalten ändert.
struct A { virtual void foo() { std::cout << "A!\n"; } } struct B : public A { virtual void foo() { std::cout << "B!\n"; } }
-
cooky451 schrieb:
82kolu schrieb:
Ich will ja das virtual verstehen...
Wenn das dein Hauptziel ist, ist deine Frage doof, weil virtual eine völlig andere Funktion hat als die, nach der du hier fragst. Denn das kannst du auch mit normaler Vererbung erreichen. (Und das solltest du auch tun.)
virtual wird eben gerade dann spannend, wenn sich das Verhalten ändert.
struct A { virtual void foo() { std::cout << "A!\n"; } } struct B : public A { virtual void foo() { std::cout << "B!\n"; } }Aber ein fehler findest du nicht? weil ich will schon das es so funktioniert
-
82kolu schrieb:
Aber ein fehler findest du nicht? weil ich will schon das es so funktioniert
Der Code ist unvollständig und nicht mal syntaktisch korrekt, was soll man da bitte groß finden? Und warum willst du unbedingt das langsamere und für diesen Zweck überhaupt nicht konzipierte virtual verwenden? Erkläre dich doch bitte mal..
-
cooky451 schrieb:
82kolu schrieb:
Aber ein fehler findest du nicht? weil ich will schon das es so funktioniert
Der Code ist unvollständig und nicht mal syntaktisch korrekt, was soll man da bitte groß finden? Und warum willst du unbedingt das langsamere und für diesen Zweck überhaupt nicht konzipierte virtual verwenden? Erkläre dich doch bitte mal..
Weil das die Aufgabenstellung ist.
-
82kolu schrieb:
Weil das die Aufgabenstellung ist.
Die Aufgabenstellung besagt also, dass du bei einer Vektorklasse den operator == mit virtual implementieren sollst? Oder ist die Aufgabe nicht eher, dass du irgendein Anwendungsbeispiel für virtual finden sollst? (Falls ersteres zutreffen sollte versichere mir bitte, dass du nicht studierst, sonst fange ich gleich an zu weinen.)
-
cooky451 schrieb:
82kolu schrieb:
Weil das die Aufgabenstellung ist.
Die Aufgabenstellung besagt also, dass du bei einer Vektorklasse den operator == mit virtual implementieren sollst? Oder ist die Aufgabe nicht eher, dass du irgendein Anwendungsbeispiel für virtual finden sollst? (Falls ersteres zutreffen sollte versichere mir bitte, dass du nicht studierst, sonst fange ich gleich an zu weinen.)
ich studiere

aber mathe wenn dir das hilft. und ja ersteres.
also tips
-
82kolu schrieb:
aber mathe wenn dir das hilft.
Nicht wirklich. *schnief*
82kolu schrieb:
also tips

Na ja, mach es wie oben.
template<unsigned int N> class A { public: virtual bool operator == (const A &a) const { for (unsigned i = 0; i < N; ++i) // Vektor vergleichen } }; // *schnief*, sorry class B : public A<3> { public: virtual bool operator == (const B &b) const { return true /* Hier vergleichst du jetzt einfach den Inhalt ohne Schleife, so kann man sich noch etwas Sinn in das Ganze einreden. */ ; } };Falls es immer noch nicht klappt, poste den vollständigen Code, mit allen Compilerfehlern. (Dran schreiben welcher Codezeile das hier im Forum entsprechen würde.) (Edit: Und nimm [ cpp ] statt [ code ] Tags, dann ist das so schön bunt.)
-
cooky451 schrieb:
template<unsigned int N> class A { public: virtual bool operator == (const A &a) const //A fehlt der template parameter { for (unsigned i = 0; i < N; ++i) // Vektor vergleichen } }; // *schnief*, sorryIch versteh nach wie vor den Sinn nicht ganz. Suchst du vielleicht sowas?
template< class Type , unsigned int Dim > class Vector { public: bool operator==( const Vector< Type , Dim > &v ) const { //Elemente vergleichen, anderer Vector hat die gleiche Dimension } }; template< class Type > class Vector3 : public Vector< Type , 3 > { }; ////////////////// Vector3< int > v3; Vector< int , 3 > v; v3 == v; v == v3; Vector< int , 4 > v_4; v4 == v3; //compile error, wüsste auch nicht was das Ergebnis sein sollteWenn die Vorgabe ist, dass operator== virtual sein muss, dann mach ihn halt virtual, aber sinnvoll ist es nicht, weil nirgends dynamische Polymorphie verwendet wird.
-
Dir ist aber schon bewusst, dass ich die Frage beantwortet und nicht gestellt habe, und dass du gerade auf einen abgeschlossenen Thread geantwortet hast?
UndGorbGorb schrieb:
cooky451 schrieb:
public: virtual bool operator == (const A &a) const //A fehlt der template parameter // Nein, tut er nicht.
-
Jain. Deine Lösung war ja nicht ganz richtig.
-
GorbGorb schrieb:
Jain. Deine Lösung war ja nicht ganz richtig.
Doch, war sie. Lies erst mal den ganzen Thread.
-
template<unsigned int N> class A { public: virtual bool operator == (const A<N> &a) const //das <N> hat gefehlt { for (unsigned i = 0; i < N; ++i) // Vektor vergleichen } }; // *schnief*, sorry
-