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:
- Du hast ein Speicherleck, das ursprüngliche Objekt, auf das m_MotorMap gezeigt hat, wird nie gelöscht.
- 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