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


Anmelden zum Antworten