Problem bei Übergabe von CMAP



  • Hallo,

    Ich habe hier folgende CMAP:

    CMap < CString, LPCTSTR, CSiMotor, CSiMotor& > m_MotorMap;
    

    CSiMotor ist hier eine Klasse, sieht wie folgt aus:

    class CSiMotor
    {
    public:
      CSiMotor( CString name="",
                double vmin=0.0, 
                double vmax=0.0, 
                double acc=0.0, 
                double m_res=0.0);
    
      CString GetName ();
      double  GetVmin ();
      double  GetVmax ();
      double  GetAcc  ();
      double  GetRes  ();
    
    protected:
      CString   m_name;
      double    m_vmin;
      double    m_vmax;
      double    m_acc;
      double    m_res;
    };
    

    Die oben gezeiget CMAP befindet sich in der Singleton Klasse CSIConfig.

    Ich möchte nun aus einer Fremden Klasse einen Eintrag aus CMAP holen, mache folgendes:

    CMap < CString, LPCTSTR, CSiMotor, CSiMotor& >  m_MotorMap;
      m_pConfig = CSiConfig::Instance();
      (*m_pConfig).getMotorMap( &m_MotorMap );
    

    Die Funktion getMotorMap macht nichts weiter als:

    void CSiConfig::getMotorMap( CMap< CString, LPCTSTR, CSiMotor, CSiMotor& > *MotorMap )
    {
      MotorMap = &m_MotorMap;
    }
    

    Mein Ziel ist ein Lookup zu machen:

    CSiMotor tempMotor;
      int test = m_MotorMap.Lookup(m_strMotor, tempMotor);
    

    Hier aber gibt der Aufruf 0 zurück -> fehlgeschlagen.

    Wieso es fehlschlägt finde ich weiter oben, das hier klappt nämlich nicht:

    CMap < CString, LPCTSTR, CSiMotor, CSiMotor& >  m_MotorMap;
      m_pConfig = CSiConfig::Instance();
      (*m_pConfig).getMotorMap( &m_MotorMap );
    

    Die Variable m_MotorMap bleibt leer, obwohl diese Zuweisung in der Funktion getMotorMap klappt!
    d.h.: Das hier klappt, aber sobalt ich aus der Funktion raus bin, sind auch die Werte weg.

    {
      MotorMap = &m_MotorMap;
    }
    

    Was habe ich nicht beachtet?



  • 😃
    Also wie wäre mit einem Pointr-Pointer
    oder einer Referenz auf einen Pointer.

    Also :

    void CSiConfig::getMotorMap( CMap< CString, LPCTSTR, CSiMotor, CSiMotor& > **MotorMap )
    {
      MotorMap = &m_MotorMap;
    }
    

    so als Beispiel...



  • Stalin schrieb:

    😃

    Wieso der Smiley? Dein Weg ist der einzige, wenn er den Zeiger per Parameter übergibt. Die einzige alternative wäre folgendes:

    CMap< CString, LPCTSTR, CSiMotor, CSiMotor& >* CSiConfig::getMotorMap( )
    {
      return &m_MotorMap;
    } 
    
    CMap < CString, LPCTSTR, CSiMotor, CSiMotor& >  *m_pMotorMap;
      m_pConfig = CSiConfig::Instance();
    m_pMotorMap=  (*m_pConfig).getMotorMap();
    


  • @Stalin:
    Dein Code ist übrigens nciht ganz korrekt. Es muß folgendermaßen heißen:
    [cpp]void CSiConfig::getMotorMap( CMap< CString, LPCTSTR, CSiMotor, CSiMotor& > **MotorMap )
    {
    *****MotorMap = &m_MotorMap;
    } [/cpp]

    @bsash:
    Jo, die Lösung für dein Problem hast du inzwischen, aber noch ein Hinweis:
    Wenn du die Adresse eines Objektes innerhalb einer Funktion ändern willst, dann erstellst du kein Objekt!

    CMap < CString, LPCTSTR, CSiMotor, CSiMotor& >  m_MotorMap;
      m_pConfig = CSiConfig::Instance();
      (*m_pConfig).getMotorMap( &m_MotorMap );
    

    Das ist ganz grober Unfug. Du hast das Objekt m_MotorMap, für welches Speicher allokiert wurde bei der Erstellung und dann willst du einfach dessen Adresse ändern ... Das gibt (mindestens) zwei Probleme:

    1. Du hast ein Speicherleck, das ursprüngliche Objekt, auf das m_MotorMap gezeigt hat, wird nie gelöscht.
    2. Wenn der Gültigkeitsbereich von m_MotorMap verlassen wird, dann wird dein Objekt CSiConfig::m_MotorMap ungültig, da ja beide auf den selben Speicherbereich zeigen, der Destruktor von deinem lokalen m_MotorMap den Speicher aber freigibt. Bei Zeigern musst du gut aufpassen ⚠

Log in to reply