Objektorietierung: Methode mit unterschiedlichen STL map verwenden



  • Hallo,

    ich habe ein Verständisproblem beim Methodenaufruf.
    Folgende Methode möchte ich für 3 verschiedene Fälle verwenden.

    bool navContainer::getAllWPInRange( double lat0, double lon0, double rangeNM ) 
    {
    	float dist2;
    	if(	EWP.size() < 2 ) { 
    		return false;
    	}
    	// EWP ist schon mit Daten gefüllt
    	std::multimap<std::string,NavData>::iterator it = EWP.begin();
    	std::string LastKey = it->first;
    
    	while( it != EWP.end() ) {
    		std::string stringlat = it->second.lat;
    		std::string stringlon = it->second.lon;
    
    		double lat; 
    		std::istringstream(it->second.lat)>>lat;
    		double lon;
    		std::istringstream(it->second.lon)>>lon;
    
    		lat = lat / 3600000.0f;
    		lon = lon/3600000.0f;
    		dist2 = distance( lat0, lon0, lat, lon );
    		if ( ( rangeNM == 0.0 ) || (  dist2 <= rangeNM) ){//(dist2 <= 1.1* rangeNM  * NM2M)) {
    			// speichere in neuer map
    
    // in EWPinRange werden alle Daten gespeichert die aus EWP benötigt werden
    EWPinRange.insert(make_pair(it->first,NavData(it->second.name, it->second.typ,it->second.lat,it->second.lon,it->second.freq))); 
    
    		}
    
    		++it;
    	}
    	ewpTrue  = true;
    		EWPLoaded = true;
    
    	//		}
    
    		  return true;
    }
    

    Bisjetzt wird die Methode 1x aufgerufen. Bei den weiteren Aufrufen soll von der Logik her das gleiche passieren. Nur die Daten kommen aus anderen maps(bisher EWP) und sollen in anderen stl Mappen gespeichert werden (bisher EWPinRange).

    hier die definition der map

    std::multimap<std::string,NavData> NNDM; 
    	std::multimap<std::string,NavData> VOR; 
    	std::multimap<std::string,NavData> EWPinRange; 
    	std::multimap<std::string,NavData> tmpEWP;
    

    Jetzt meine Frage, ist die s.u. Lösung OK, oder ist das völlig an der Objektorientierung vorbei? Kann mir jemand nen Lösungsvorschlag geben?

    also meine Idee ist, einen neuen Parameter einzuführen, der festlegt welche map gefüllt werden soll.

    bool navContainer::getAllWPInRange( double lat0, double lon0, double rangeNM, int typ) 
    {
    	float dist2;
    
            int m_typ = typ;
    	if (typ == "aaa") {
            MAP = AAA; 
            MAPinRange = AAAinRange; // Zuweisung ??
    }
    else if(typ == "bbb") {
    MAP = BBB;
    MAPinRange = BBBinRange;
    }
    ..
    if(	MAP.size() < 2 ) { 
    		return false;
    	}
    	std::multimap<std::string,NavData>::iterator it = MAP.begin(); // ??
    	std::string LastKey = it->first;
    
    	while( it != MAP.end() ) {
    		std::string stringlat = it->second.lat;
    		std::string stringlon = it->second.lon;
    
    		double lat; 
    		std::istringstream(it->second.lat)>>lat;
    		double lon;
    		std::istringstream(it->second.lon)>>lon;
    
    		lat = lat / 3600000.0f;
    		lon = lon/3600000.0f;
    		dist2 = distance( lat0, lon0, lat, lon );
    		if ( ( rangeNM == 0.0 ) || (  dist2 <= rangeNM) ){//(dist2 <= 1.1* rangeNM  * NM2M)) {
    			// speichere in neuer map
    
    			MAPinRange.insert(make_pair(it->first,NavData(it->second.name, it->second.typ,it->second.lat,it->second.lon,it->second.freq))); 
    
    		}
    
    		++it;
    	}
    	ewpTrue  = true;
    		EWPLoaded = true;
    
    	//		}
    
    		  return true;
    }
    

    vielen Dank schon mal...



  • hast dus denn ausprobiert obs funktioniert? ich denke nämlich, es funktioniert nicht. Was fürn Typ haben MAP und MAPinRange? Sind das lokale variablen? Dann änderst du auch nur die lokalen variablen und nicht die die du eigentlich ändern willst.

    Wie wärs, wenn du der funktion eine Referenz auf die eingabemap und eine referenz auf die ausgabemap gibst?



  • Hi, vielen Dank!

    Also, es funktioniert so nicht.

    Aber ich denke deine Idee ist eh besser.

    "Wie wärs, wenn du der funktion eine Referenz auf die eingabemap und eine referenz auf die ausgabemap gibst?"

    Du meinst so?

    bool navContainer::getAllWPInRange( double lat0, double lon0, double rangeNM, &std::multimap<std::string,NavData> eingabemap, &std::multimap<std::string,NavData> ausgabemap)
    {
    float dist2;
        if(    eingabemap.size() < 2 ) {
            return false;
        }
        // EWP ist schon mit Daten gefüllt
        std::multimap<std::string,NavData>::iterator it = eingabemap.begin();
        std::string LastKey = it->first;
    
        while( it != eingabemap.end() ) {
            std::string stringlat = it->second.lat;
            std::string stringlon = it->second.lon;
    
            double lat;
            std::istringstream(it->second.lat)>>lat;
            double lon;
            std::istringstream(it->second.lon)>>lon;
    
            lat = lat / 3600000.0f;
            lon = lon/3600000.0f;
            dist2 = distance( lat0, lon0, lat, lon );
            if ( ( rangeNM == 0.0 ) || (  dist2 <= rangeNM) ){//(dist2 <= 1.1* rangeNM  * NM2M)) {
                // speichere in neuer map
    
    // in EWPinRange werden alle Daten gespeichert die aus EWP benötigt werden
    ausgabemap.insert(make_pair(it->first,NavData(it->second.name, it->second.typ,it->second.lat,it->second.lon,it->second.freq)));
    
            }
    
            ++it;
        }
    
    }
    

    Was passiert wenn ich eine Referenz auf die Mappen übergebe?
    Es wird nicht der Wert, sondern die Adresse der Speicherzelle übergeben. Stimmt das?
    Die Mappen haben ca. 800 Einträge, und ich wollte nicht Daten hin und her schieben. Aber mit Referenz passiert das nicht?

    Und dann noch, ist der Aufruf korrekt?

    getAllWPInRange( 59, 9, 50, EWP, EWPinRange);
         getAllWPInRange( 60, 9.7, 50, AAA, AAAinRange);
    
    ...
    

    vielen Dank für die Hilfe!



  • ja, wenn du eine referenz übergibst, wird nur die adresse wo die map liegt kopiert.

    btw... eine map ist keie mappe 😉 aber das nur am rande.

    Wenn du keine Referenz übergeben würdest, dann würde die ganze map kopiert werden, und, was noch viel wichtiger ist, es würde nur deine Kopie bearbeitet werden und nicht das original was du übergeben wolltest.

    nochwas: deine syntax ist falsch, im parameter muss es heißen

    std::multimap<std::string, unddasandere>& parameter

    Das & muss also nach dem typ un nich vor dem typ stehen.



  • danke, werd's ausprobieren


Anmelden zum Antworten