Adress-Änderung?

08/05/2015 - 18:00 von Heinz-Mario Frühbeis | Report spam
Hallo!

Nun habe ich doch noch was, wo ich überhaupt nicht weiß, wo ansetzen...

In einem Vector sammle ich in einem Pair die Adresse von 'this' und die
einer anderen Klasse.

Die Klasse ClassX:

typedef std::pair <ClassZ*, ClassX*> td_Pair_Member;
typedef std::vector <td_Pair_Member> td_Vec_Member;
td_Vec_Member mVecMember;

class ClassX{
public:
ClassX(){
// hier wird dem Vector per pushback ein Pair (td_Pair_Member)
drangehangen >> second ist this
}
void UpdateVector(void *nVal){
// im Vector nach 'this' suchen und first updaten
}
std::string GetKey(){
ClassZ *nClassZ;
std::string nKey;
//hier wird der Vector abgefragt, was für 'this' die Klasse ClassZ ist
nKey = nClassZ.Key();
Ausgabe [B]
return nKey;
}
}

Die Funktion [2]:

ClassX ClassY::DoSome(int i){
ClassX nClassX;
ClassZ *nClassZ;
nClassZ = ...
nClassX.UpdateVector( (void*) nClassZ)
Ausgabe [A]
}

Der Aufruf [1]:
ClassX mClassX;
mClassX.DoSome(1).GetKey();

[A] TEST NODE BY INT C 2 0x7fff8d52a68c 1 0x7fff8d52a61f // Das ist die
Adresse einer Variablen innerhalb der Funktion[2], die durch diese
Funktion zurückgegeben wird, die Adresse der Funktion[2], und die von
'this' (von ClassX)

[B] TEST GET KEY 0x7fff8d52a68f // Das ist die (aktuelle?) Adresse von
'this' (von ClassX)

[C] TEST GETMEMBER 0x7fff8d52a68c // Ausgabe vom Vector
[C] TEST GETMEMBER 0x7fff8d52a68d // Ausgabe vom Vector
[C] TEST GETMEMBER 0x7fff8d52a68e // Ausgabe vom Vector
[C] TEST GETMEMBER 0x7fff8d52a61f // Ausgabe vom Vector

Das Problem ist, daß für den Aufruf [1] keine Klasse ClassZ zu 'this'
gefunden wird (denn gesucht wird ja nach 0x7fff8d52a61f und nicht nach
0x7fff8d52a68f, die ja eben auch nicht im Vector ist). Denn in der der
Funktion[2] ist die Adresse von nClassX == 0x7fff8d52a61f, aber in
GetKey() von ClassX wird 'this' als 0x7fff8d52a68f angegeben...
Es fand aber keine weitere Initialisierung statt (also kein
Konstruktor-Aufruf).
Hat sich, oder wurde die Adresse geàndert..., oder wie kann man sich das
vorstellen? Aber wie kann man denn nun sicherstellen, daß in 'DoSome'
(UpdateVector)[2] die quasi Verknüpfung von 'this' und ClassZ funktioniert?

Ach ja, das Ganze findet unter einer GNU/Linux-Distribution statt...,
falls es relevant ist.

Ich weiß..., es ist vielleicht (wieder) schmal gehalten, aber ich
denke/hoffe, daß die relevanten Dinge drin sind. Aber vielleicht kann
man mir doch helfen, oder zumindest mitteilen, was funktioniert und was
nicht.

Mit Gruß
Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Florian Weimer
09/05/2015 - 08:20 | Warnen spam
* Heinz-Mario Frühbeis:

In einem Vector sammle ich in einem Pair die Adresse von 'this'



Du mußt sicherstellen, daß das Objekt lange genug lebt, also lànger
als dieser Gespeicherter Zeiger. Aus Deinem Code-Beispiel geht nicht
hervor, wie Du versuchst, dies zu erreichen.

Ähnliche fragen