Fehler? Ich blick net warum...
-
Folgendes:
//Objekt über funktion erzeugen CKinMovement &CHandlerKinematic::CreateMovement(const double dDistance){ return CHandlerKinematic::CKinMovement(this,dDistance); }//Konstrukur des zu erzeugenden Objekts: CKinMovement(CHandlerKinematic *p,double dDistance) : pKinematicPara(p),m_dDistance(dDistance){......}fehler:
c:\test\AllocStruct\Transfer.h(113): error C2662: 'CHandlerKinematic::CreateMovement' : cannot convert 'this' pointer from 'const CHandlerKinematic' to 'CHandlerKinematic &'tauch auf wenn ich sowas maceh:
CHandlerKinematic::CKinMovement oTrans= m_pHandler->oKinematic.CreateMovement(abs((int)(iToMod-iFromMod))*1);ein CHandlerKinamtic Objekt ist im m_pHandler Objekt enthalten
-
Ist oKinematic konstant?
-
nein so wird es initalisert:
class CHandler{ CHandler() : oKinematic(2.0,4.0,2.0){} //Kinamtische Eigenschaften des Handlers CHandlerKinematic oKinematic; }und über m_pHandler-> greif ich auf das CHandler Objekt zu!
-
ich kann irgendwie keien funktione aus CHandlerKinematic aufrufen..
es kommt dann diese fehler...
-
Wie sieht denn die Definition von CHandlerKinematic aus?
-
class CHandlerKinematic{ public: //####################################################### // Struktur Range // // Definiert Bereich für Berechungen (Strecken/Zeit Bereich etc.) // //####################################################### struct Range{ double m_dFrom; double m_dTo; double m_dDiff; Range(double F=0,double T=0): m_dFrom(F), m_dTo(T), m_dDiff(T-F){} }; //############################################################################################################ // // Class: CKinMovement // // Description: Class Represents the Movement Physical Parameters for Handler Transfer // //############################################################################################################ class CKinMovement{ friend CHandlerKinematic; public: double m_dVMaxSpeed; //Maximal ereichbare Geschwindigkeit double m_dTAcceleration; //Dauer der Beschleunigung double m_dTDeceleration; //Dauer der Verögerung double m_dTCruise; //Dauer der Konstanten Bewgung (Zwischen Beschleunigung und Verzögerung) double m_dSAcceleration; //Strecke während der Beschleunigung double m_dSDeceleration; //Strecke während der Verzögerung double m_dSCruise; //Streck bei max. Geschwindigkeit double m_dDistance; //Gesamte Strecke der Bewegung CHandlerKinematic *pKinematicPara; private: //Konstruktor (Privat, nur über CHandlerKinematic aufrufbar bzw. erzeugbar) CKinMovement(CHandlerKinematic *p,double dDistance) : pKinematicPara(p),m_dDistance(dDistance){ ........ } public: CKinMovement(){} ~CKinMovement(){} CHandlerKinematic::Range Calc_T(const CHandlerKinematic::Range &Distance); }; private: const double m_dAccelerate; //Beschleunigung (a= m/s²) const double m_dDecelerate; //Verzögerung (a= m/s²) const double m_dVMax; //Maximal Geschwindigkeit der Handler (v= m/s) const double m_dAvgAccDec; //Durchschnitt aus (Beschleunigun/Verzögerung) (a= m/s²) public: //Konstruktor CHandlerKinematic(double dAcc,double dDec,double dVMax): m_dAccelerate(dAcc), m_dDecelerate(dDec), m_dVMax(dVMax), m_dAvgAccDec(1/ ( ( 1 / abs(dAcc) ) + ( 1 / abs(dDec) ))){ } //Destruktor virtual ~CHandlerKinematic(); CKinMovement &CreateMovement(const double dDistance){ return CHandlerKinematic::CKinMovement(this,dDistance); } };P.S: wenn ich CHandlerkinematic in CHandler per new, und dann über den zeiger zugrieffe funktioniert es...:
class CHandler{ CHandler() : oKinematic(2.0,4.0,2.0), pKinematic(new CHandlerKinematic(2.0,4.0,2.0)){} //Kinamtische Eigenschaften des Handlers CHandlerKinematic oKinematic; CHanderKinematic *pKineamtic; }über oKinematic nein, über pkinematic ja;)
-
Versuch mal:
CKinMovement CreateMovement(const double dDistance)Und außerdem:
friend class CHandlerKinematic;
-
Übirgens: Wenn du den Default-Ctor öffentlich anlegst, unterminierst du selber deine Bemühungen, andere Programme am Objekte-Anlegen zu hindern (die können dann zwar kein vollwertiges Objekt erzeugen, aber immer noch ein Dummy-Objekt).
-
nützt beides nichts...
kann es sein das er oKineamtic automatisch const macht?
-
BorisDieKlinge schrieb:
Folgendes:
//Objekt über funktion erzeugen CKinMovement &CHandlerKinematic::CreateMovement(const double dDistance){ return CHandlerKinematic::CKinMovement(this,dDistance); }Ohne jetzt alles anzuschauen: Könnte es sein das du ein temporäres Objekt über eine Referenz zurückgibst?
Dies darf man NIEMALS machen. Das Objekt ist nur lokal innerhalb der Methode/Funktion gültig, bei der Rückgabe segnet es aber bereits das Zeitliche.
Es ist wichtig zu wissen wann ein Objekt und wann eine Referenz zurückgegeben wird. Siehe auch [Meyers06], Tip 21, falls du dieses Buch besitzt.
cu André
[Meyers06] Effektiv C++ programmieren, 3.Auflage; Addison-Wesley Verlag
-
ups.. stimmt die referenz muss weg sorry.. aber trozdem geht es nich