Container- map mit einem Zeiger

Mickeyman

Mitglied
Anmerkung: Benutze Microsoft Visual c++ 6.0
Habe auch schon überall nach einer Lösung gesucht.

Hallo,
ich habe ein Problem mit mit den maps, der sich folgendermaßen aufbaut:

Code:
#include <iostream>
#include <string>
#include <map>

using namespace std;


typedef multimap< string, void* > MAP;
typedef MAP::value_type paar;

class cTest {
	MAP map;
	void* Zeiger;

public:

	void test(void) {
		map.insert( paar("Klaus", &Zeiger) );
		Zeiger = &( *map.find("Klaus") );
		MAP::iterator it = map.find("Klaus");
		cout << it -> first << "   " << ( **(it -> second) ) -> first;
	}
};

void main(void) {
	cTest Test;

        Test.test();

	system("PAUSE");
}

Das Problem liegt bei
Code:
cout << it -> first << "   " << ( **(it -> second) ) -> first;
Er meint immer, dass die Zeigeroperatoren ungülig sind. Ich verstehe aber nicht warum, denn
Code:
(it -> second)
ist doch ein Zeiger der auf einen Zeiger zeigt. Also muss ich ihn doch mit ** ansprechen, um das Objekt des Zeigers vom Zeiger zu erhalten.

Ich hoffe mir kann da jemand helfen.

p.s Ich hoffe ich habe nicht vergessen etwas zu erwähnen, ansonsten werde ich es auf Wunsch natürlich ergänzen.
 
Was genau soll cout denn ausgeben? Denn void*-Wert oder die Adresse des void-Pointers?

So oder so, da ist ein Sternchen zuviel, it->second gibt dir bereits direkt den void*-Wert zurück. Wenn du jetzt den Wert direkt haben willst, reicht

cout << it->second;

Wenn du die Adresse des Pointers haben willst (wozu auch immer), musst du ein & vorne dran stellen: &( it->second ).

Falls ich mich nicht wieder grässlich vertan habe, bei sowas muss ich auch immer ein zweimal probieren :)
 
Hallo,
danke erst mal für deine Antwort.

Ich möchte das Objekt vom Zeiger (außerhalb der map) haben aber über den Zeiger in der map. Eigentlich liegt das Problem schon darin, dass ich nicht auf den Zeiger (außerhalb der map) komme. Bzw. ich schaffe es nicht über den Zeiger in der map irgend jemanden anzusprechen.

Ich habe bereits versucht alle Zeiger-operatoren weg zu lassen. Allerdings gab er mir dann nur die Adresse aus.


Ich habe auch schon versucht den Zeiger in der map auf eine int Variable zeigen zu lassen aber auch das ergab den gleichen Fehler, als ich mit " * " arbeitete:
error C2100: Zeigeroperation ungueltig

Ich hoffe mir kann jemand helfen.
 
Einer der Haken ist, dass du da einen void-Pointer reingesetzt hast. Es gibt keinen "void"-Typ, der sich ansprechen lässt. Das klappt nur mit tatsächlich verwertbaren Typen. Mit dem int sollte das eigentlich klappen, du musst da nur Klammern drumrum setzen, da sonst der iterator vor dem Auswerten von ->second dereferenziert wird.

Also nicht einfach:

*it->second

sondern:

*( it->second )
 
Ich glaub ich hab es geschafft, auch wenn es, so finde ich, ein wenig komisch aussieht:

Code:
#include <iostream>
#include <string>
#include <map>

using namespace std;


typedef multimap< int, int*** > MAP;
typedef MAP::value_type paar;

class cTest {
	MAP map;
	int** Zeiger1;
	paar* Zeiger2;

public:

	
	void test(void) {
		Zeiger1 = (int**) &Zeiger2;
		map.insert( paar(62533, &Zeiger1) );
		Zeiger2 = &( *map.find(62533) );
		MAP::iterator it = map.find(62533);
		cout << it -> first << "           " << (***(it -> second) ) << endl 
			<< "&Zeiger1:       " << &Zeiger1 << endl 
			<< "&Zeiger2:       " << &Zeiger2 << endl 
			<< "Zeiger2:        " << Zeiger2 << endl 
			<< "&it:            " << &it << endl 
			<< "&(it -> first): " << &(it -> first) << endl;
	}
};

void main(void) {
	cTest Test;

        Test.test();

	system("PAUSE");
}
Hinweis: Die anderen Angaben unter "cout" sind nur zum Testen gewesen.

Er hat mir die Nummer ( 62533 ) ausgegeben ( it -> first). Ich bin mir jetzt aber nicht sicher ob das, wie ich es gemnacht habe, auch eine gute Lösung ist.
Es irretiert mich, dass ich dem Zeiger in der map sagen muss, auf wie viele Zeiger er zeigt (mit "***").
Kann man das vielleicht auch anders Lösen?
 
Guten Tag,
leider hat mir keiner auf meine Nachricht geantwortet. :( Hab mir jetzt da aber auch selber geholfen.
Leider habe ich immer noch ein Problem und hoffe dabei auf Eure Unterstützung:

Ich möchte den Zeiger in der map auf ein paar in einer map zeigen lassen. Am Ende soll sich daraus ein "Kreis" bilden. Das Problem dabei ist, dass der Zeiger es nicht schafft auf das Paar zu zeigen, statt dessen zeigt er immer auf den Inhalt von "first" im paar.

Wenn ich einen Iterator erzeugen könnte, wäre es kein Problem aber leider geht es nicht, da die Klasse, zu dem der Iterator gehören soll, noch nicht existiert:

Code:
typedef map<string, Nummern::iterator> Namen;
typedef map<int, Namen::iterator> Nummern;

Könnte mir da bitte jemand Helfen?
 
Zurück